PyAudio输出缓慢/噼啪声/乱码音频

时间:2015-07-13 19:25:23

标签: python audio raspberry-pi portaudio pyaudio

我正在尝试使用pyaudio来播放一些波形文件,但我总是遇到缓慢/噼啪声/乱码输出。

当我按照下面的描述播放这个波形文件时,音频播放得很好:

$ wget http://www.freespecialeffects.co.uk/soundfx/sirens/police_s.wav
$ aplay police_s.wav

但是,当我从 / pyaudio / test 打开'play_wave.py'示例时,音频非常慢且乱码,对任何应用程序都没用。< / p>

"""PyAudio Example: Play a wave file."""

import pyaudio
import wave
import sys

CHUNK = 1024

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

wf = wave.open('police_s.wav', 'rb')

# instantiate PyAudio (1)
p = pyaudio.PyAudio()

# open stream (2)
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 (3)
while data != '':
    stream.write(data)
    data = wf.readframes(CHUNK)

# stop stream (4)
stream.stop_stream()
stream.close()

# close PyAudio (5)
p.terminate()

要在笔记本电脑/ PC上重现类似的低质量,只需使CHUNK = 1(我的Ubuntu上的输出非常相似)

其他信息:

我尝试了什么:

1 - 另一个Raspberry Pi B +。

2 - 更改每个缓冲区的音频样本:

正如我假设问题是每个缓冲区的音频样本(本例中为CHUNK变量),我做了一个循环,将CHUNK增加1并为每个增量播放音频。我注意到一些CHUNK值略有不同,但是当我通过aplay播放它时,我的质量甚至都没有。但是,我注意到这两个文件之间存在很大差异:

1- police_s.wav = 8位,22000Hz,Mono,176kb / s - &gt;比同一个CHUNK(2048)播放的beat.wav更好的方式

2- beat.wav = 16bits,44100Hz,Stereo,1411 kb / s

当我通过示例 /pyaudio/test/play_wave_callback.py 播放相同的音频时,输出几乎是完美的,除了音频结束时的一些中断。所以我看到它没有设置CHUNK。它在回调函数中使用 frame_count 参数,所以我打印它并看到它是1024¬,与示例 /pyaudio/test/play_wave.py一样的默认值会导致音频乱码。

3 - pyaudio 0.2.4: 由于hayderOICO提到他正在使用pyaudio 0.2.4并说“我正在使用PyAudio。”,我决定尝试使用旧版本,但我得到的结果相同......

4 - disable_audio_dither = 1 添加到config.txt

我正在使用: Raspberry Pi B + Raspbian python 2.7.3 pyaudio v0.2.8 portaudio19-dev TRRS模拟音频

我如何安装所有内容:

第一次尝试:

$ sudo apt-get update
$ sudo apt-get -y install python-dev python-numpy cython python-smbus portaudio19-dev
$ git clone http://people.csail.mit.edu/hubert/git/pyaudio.git
$ cd pyaudio
$ sudo python setup.py install

第二次尝试:

$ sudo apt-get install python-pyaudio

第三次尝试:

来自GitHub:https://github.com/jleb/pyaudio

让图书馆的示例在Pi上无法正常工作非常令人沮丧。我不认为这是硬件限制,因为相同的音频与aplay和其他库如pygame和SDL2一起播放。

我是Raspberry Pi和音频编程的新手,所以我希望做一些愚蠢的事...... 由于我已经在使用pyaudio的特定包装器,我真的想继续使用它而不是转移到另一个库... 我感谢任何帮助,建议和建议。

提前致谢!

3 个答案:

答案 0 :(得分:1)

我的树莓派(和我的mac)上有类似的问题。根据我的经验,pyaudio库是一种痛苦的工作(经过2周的战斗,我最终使用了pygame)。对我有用的是检查音频输出的默认采样率并检查它是否相同,并将声音播放为numpy数组。

所以在RPi上,我检查(从ubuntu这里推断......)文件

/etc/pulse/daemon.conf
and

/etc/asound.conf or 
~/.asoundrc

numpy数组的直接播放是否有效?如果是这样,你可以以迂回的方式做到这一点...这里有一些代码来测试你是否喜欢

import pyaudio 
import numpy as np


def gensin(frequency, duration, sampRate):

    """ Frequency in Hz, duration in seconds and sampleRate
        in Hz"""

    cycles = np.linspace(0,duration*2*np.pi,num=duration*sampRate)
    wave = np.sin(cycles*frequency,dtype='float32')
    t = np.divide(cycles,2*np.pi)

    return t, wave

frequency=8000 #in Hz
duration=1 #in seconds
sampRate=44100 #in Hz

t, sinWav = gensin(frequency,duration,sampRate)

p = pyaudio.PyAudio()

stream = p.open(format = pyaudio.paInt32, 
                channels = 1, 
                rate = sampRate, 
                output = True)

stream.start_stream()

stream.write(sinWav)

这适用于我的RPi和Mac,但正如我之前所说的那样,我最终使用了pygame,因为即使在开启和关闭斜坡上,我也无法在开始和结束时摆脱噼啪声并且采样率不是很高。一些可以轻易改变的东西。我真的会建议不要使用pyaudio,但是如果你设置它,我祝你好运! :)

答案 1 :(得分:0)

我在使用 pyaudio 的 Raspberry Pi 上遇到了同样的问题。使用更高的块大小值(例如 40960)并通过 frames_per_buffer 传递它 与较小的块大小值(例如 1024)相比,p.open 将使音乐播放更流畅,更少的爆裂声和静态噪音。

答案 2 :(得分:-1)

我有同样的问题。但这已经解决了:正如第一个响应所说,只需将“ frames_per_buffer”参数传递给p.open调用即可:

zero