使用RTL_SDR播放FM音频时PyAudio需bytes却得到tuple的解决求助
问题根源
报错的直接原因是手动把numpy音频数组和采样率打包成了tuple类型直接传给stream.write(),除此之外代码还有格式不匹配、资源重复初始化的问题,修改步骤如下:
1. 核心错误修正
pyaudio的write()方法只接受原始二进制字节流,不需要把采样率打包进传输内容,你编写的audio = (x7.astype("int16"),thread2.Fs_audio)属于错误写法,直接把音频numpy数组转成对应格式的bytes即可。
2. 对齐采样格式与采样率
你当前开流时选的是pyaudio.paFloat32格式,但实际转换的是int16类型,格式完全不匹配;而且采样率写死为4800,和实际输出的thread2.Fs_audio不一致,会导致声音变调。另外不要在循环里重复初始化pyaudio和stream,会严重占用系统资源。
3. 修改后的完整播放逻辑
把你原来的try块内容替换为以下代码即可:
try: # 先等待第一帧处理完成,拿到实际采样率后再初始化pyaudio first_x7 = sounds.get() Fs_audio = int(thread2.Fs_audio) p = pyaudio.PyAudio() stream = p.open(format=pyaudio.paInt16, # 匹配int16的音频格式 channels=1, rate=Fs_audio, # 用实际输出的音频采样率 output=True, frames_per_buffer=2048 ) # 播放第一帧 stream.write(first_x7.astype("int16").tobytes()) print('playing...') while True: x7 = sounds.get() # numpy数组转int16后再转原始字节传入流即可 stream.write(x7.astype("int16").tobytes()) except KeyboardInterrupt: print("bye") thread1.stopit = True thread2.stopit = True # 退出前释放资源 stream.stop_stream() stream.close() p.terminate()
可选优化项
- processThread里的滤波逻辑存在重复计算,前面计算的x3、x4未使用就被新赋值的x4覆盖,无用代码可删除降低运算量
- 8192000/4的采样读入块过大,会导致播放延迟很高,可改成256*1024这类更小的块提升实时性
内容的提问来源于stack exchange,提问作者nate
相关产品推荐
相关产品推荐

