【问题标题】:How to play a stereo aiff file with pyaudio?如何使用 pyaudio 播放立体声 aiff 文件?
【发布时间】:2015-07-15 01:03:13
【问题描述】:

这播放单声道 aifc 文件,但对于任何立体声文件,我都会听到很大的静电声:

import pyaudio
import aifc

CHUNK = 1024

wf = aifc.open('C:\\path_to_file.aiff', '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()

我正在测试的立体声文件:https://archive.org/details/TestAifAiffFile

我在 Windows 7 上,如果这很重要的话。

【问题讨论】:

    标签: python python-2.7 audio pyaudio


    【解决方案1】:

    交换所有其他样本就可以了。将整个文件加载到data,然后执行

    a = numpy.fromstring(data, dtype = '<i2')
    temp = a[1::2]
    a[1::2] = a[::2]
    a[::2] = temp
    

    然后播放a,就好像它是一串音频样本而不是一个numpy数组。我已经在两个不同的 aiff 文件上对其进行了测试,在这两种情况下,它都保留了两个频道并正确播放。

    这可能是因为文件的字节顺序与 pyaudio 期望的相反。

    【讨论】:

      【解决方案2】:

      我在 Linux 上尝试了您的代码,但我也听到了可怕的噪音。

      aifc 模块似乎可以正确读取文件,我将其转换为 NumPy 数组,这看起来不错:

      import numpy as np
      
      data = wf.readframes(wf.getnframes())
      sig = np.frombuffer(data, dtype='<i2').reshape(-1, wf.getnchannels())
      

      所以我猜问题出在 PyAudio 或您对它的使用上。

      我不知道解决方案,但我可以为您提供替代方案:使用 soundfilesounddevice

      import soundfile as sf
      import sounddevice as sd
      
      data, fs = sf.read('02DayIsDone.aif')
      sd.play(data, fs, blocking=True)
      

      【讨论】:

        【解决方案3】:

        您也可以考虑使用audioread 包而不是 aifc/wave/... 而不是用字节链做棘手的事情...它使用任何可用的后端解码您的音频文件,无论文件格式如何,它总是返回 16 位 little-endian 有符号整数 PCM 数据的缓冲区,您可以将其提供给 pyaudio。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-28
          • 1970-01-01
          • 1970-01-01
          • 2020-09-14
          • 2015-03-16
          • 2012-01-18
          • 1970-01-01
          相关资源
          最近更新 更多