我正在尝试使用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的特定包装器,我真的想继续使用它而不是转移到另一个库... 我感谢任何帮助,建议和建议。
提前致谢!
答案 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