Как бесконечно воспроизводить файл ".wav", используя python - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь воспроизвести файл ".wav" бесконечно, чтобы использовать его в своем эксперименте.

Я использую скрипт веб-сайта pyaudio (http://people.csail.mit.edu/hubert/pyaudio/),, однако он воспроизводится только5 секунд.

Я пытался использовать приведенный ниже код, но он воспроизводится несколько секунд.

import pyaudio
import wave

while True:
    CHUNK = 20*100

    wf = 
    wave.open('Metano_Ref_Lockin=SR830_mod=0.460V_freq=3936_PP=20_NP=100.wav', 'rb')
    data = wf.readframes(CHUNK)

   p = pyaudio.PyAudio()

   stream = p.open(format=pyaudio.paInt16,
            channels=wf.getnchannels(),
            rate=wf.getframerate(),
            output_device_index=4,
            output=True)


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

   stream.stop_stream()
   stream.close()
   p.terminate()

С другой стороны, этот код работает, тем не менее, сигнал не является равномерным (появляются некоторые шумы).

import pyaudio
import wave

CHUNK = 20*100

wf = wave.open('Metano_Ref_Lockin=SR830_mod=0.460V_freq=3936_PP=20_NP=100.wav', 'rb')
data = wf.readframes(CHUNK)

p = pyaudio.PyAudio()

stream = p.open(format=pyaudio.paInt16,
            channels=wf.getnchannels(),
            rate=wf.getframerate(),
            output_device_index=4,
            output=True)

while data != '':
    stream.write(data)

stream.stop_stream()
stream.close()
p.terminate()

Я ожидаю, что однородный сигнал будет воспроизводиться бесконечно. Спасибо.

1 Ответ

0 голосов
/ 23 мая 2019

Ваше сравнение данных должно быть

while data != b'':
    ...

или более простой вариант (пустые строки приводятся к False):

while data:
    ...

Кроме того, вам действительно следует повторно использовать wf,stream и p промежуточные циклы:

import pyaudio
import wave

CHUNK = 2 ** 11

wf = wave.open('Metano_Ref_Lockin=SR830_mod=0.460V_freq=3936_PP=20_NP=100.wav', 'rb')

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
        channels=wf.getnchannels(),
        rate=wf.getframerate(),
        output=True)


while True:
    wf.rewind()

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

wf.close()
stream.stop_stream()
stream.close()
p.terminate()
...