Как мне воспроизвести песню на PyAudio?

Я посмотрел на этот вопрос: pyaudio help play a file

Хотя на этот вопрос был дан ответ, я так и не получил четкого ответа, куда на самом деле поместить файл песни.


Это код для воспроизведения файла WAVE:

""" Play a WAVE file. """

import pyaudio
import wave
import sys

chunk = 1024

if len(sys.argv) < 2:
    print "Plays a wave file.\n\n" +\
          "Usage: %s filename.wav" % sys.argv[0]
    sys.exit(-1)

wf = wave.open(sys.argv[1], 'rb')

p = pyaudio.PyAudio()

# open stream
stream = p.open(format =
                p.get_format_from_width(wf.getsampwidth()),
                channels = wf.getnchannels(),
                rate = wf.getframerate(),
                output = True)

# read data
data = wf.readframes(chunk)

# play stream
while data != '':
    stream.write(data)
    data = wf.readframes(chunk)

stream.close()
p.terminate()

Я просмотрел код, но ничего не нашел в коде, где я на самом деле вставляю сам музыкальный файл. Когда я нажимаю кнопку «Воспроизвести» в своей программе (я использую wxform с этой программой), ничего не воспроизводится.


person user1197211    schedule 08.02.2012    source источник


Ответы (3)


Волшебная линия это:

wf = wave.open(sys.argv[1], 'rb')

Кажется, это говорит о том, что первый аргумент скрипта (sys.argv[1]) используется в качестве входных данных для волн.

person Daren Thomas    schedule 08.02.2012

Я ничего не знаю о pyaudio, но кажется совершенно очевидным, что файл песни — это первый аргумент, который передается программе при ее выполнении. Посмотрите на эту строку: wf = wave.open(sys.argv[1], 'rb') Просто измените sys.arg[1] на 'c:/filename.wav' или что-то в этом роде.

И программа не будет работать так, как она написана сейчас, если вы не передадите ей никаких аргументов. Из-за блока if len(sys.argv) < 2

person Niclas Nilsson    schedule 08.02.2012
comment
А также потому, что sys.argv[1] вызовет исключение. - person Niklas B.; 08.02.2012
comment
Ага. Но это размышление было основано на мысли, что он изменил строку wf =, а затем все еще не воспроизводил звук... Но, конечно, это отразилось бы в выводе. - person Niclas Nilsson; 08.02.2012
comment
А, да, не учел. Наверное, я просто подумал, что он будет достаточно умен, чтобы удалить это утверждение if, но я не уверен... - person Niklas B.; 09.02.2012

Вот решение: прокомментируйте оператор If и напрямую добавьте имя файла для воспроизведения.

import pyaudio
import wave
import sys

CHUNK = 1024

#if len(sys.argv) < 2:
#    print("Plays a wave file.\n\nUsage: %s output.wav" % sys.argv[0])
#    sys.exit(-1)

wf = wave.open("output.wav", 'rb')

p = pyaudio.PyAudio()

stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),
                output=True)

data = wf.readframes(CHUNK)

while data != '':
    stream.write(data)
    data = wf.readframes(CHUNK)

stream.stop_stream()
stream.close()

p.terminate()
person Mr T    schedule 22.08.2019