如何用Python将PyAudio获取的音频字节数组转为Opus编码?
将PCM音频字节数组编码为Opus格式的Python方案
当然有现成的Python库可以实现这个需求,下面是两个经过验证的常用方案,适配你用PyAudio获取的Stereo Mixer音频流场景:
1. opuslib
这是一个轻量级的Opus编码绑定库,适合手动控制编码流程:
- 安装命令:
pip install opuslib - 代码示例(适配PyAudio的PCM字节流):
import opuslib import pyaudio # 配置PyAudio参数(必须与Opus编码器兼容,推荐用48kHz采样率、16位深度) FORMAT = pyaudio.paInt16 CHANNELS = 2 # Stereo Mixer是双声道 RATE = 48000 CHUNK = 1024 # 对应Opus推荐的帧时长(~21ms) # 初始化Opus编码器 encoder = opuslib.Encoder(RATE, CHANNELS, opuslib.APPLICATION_AUDIO) # 假设audio_bytes是从PyAudio流中读取的单chunk字节数组 pcm_data = audio_bytes # 编码为Opus帧 opus_frame = encoder.encode(pcm_data, CHUNK) # 追加写入到Opus文件 with open("recording.opus", "ab") as f: f.write(opus_frame)
- 关键说明:
- 确保PyAudio输出的是16位整数格式的交错PCM(paInt16对应),这是Opus唯一支持的输入格式。
- 每次编码的PCM采样数要符合Opus规范,48kHz下1024采样是安全的帧大小。
2. pyogg
这个库对Opus的封装更友好,自带文件写入功能,适合持续录制的流式场景:
- 安装命令:
pip install pyogg - 代码示例(直接对接PyAudio监听流):
import pyogg import pyaudio # 匹配Stereo Mixer的音频参数 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 48000 CHUNK = 1024 # 创建Opus文件写入器,自动处理编码和封装 opus_writer = pyogg.OpusFileWriter("stream_recording.opus", RATE, CHANNELS) # 可自定义比特率,比如128kbps(平衡音质和体积) opus_writer.set_bitrate(128000) # 初始化PyAudio监听流 p = pyaudio.PyAudio() # 替换为你的Stereo Mixer设备索引,可通过p.get_device_info_by_index()查找 stream = p.open( format=FORMAT, channels=CHANNELS, rate=RATE, input=True, input_device_index=1, frames_per_buffer=CHUNK ) try: print("开始录制,按Ctrl+C停止") while True: audio_bytes = stream.read(CHUNK) # 直接写入,内部自动完成编码 opus_writer.write(audio_bytes) except KeyboardInterrupt: print("录制停止") # 资源清理 stream.stop_stream() stream.close() p.terminate() opus_writer.close()
- 关键说明:
- pyogg的
OpusFileWriter会自动处理Opus的Ogg封装,不需要手动拼接帧,输出的是标准的.opus文件。 - 若需要处理已有的字节数组,直接调用
write()传入PCM字节即可。
- pyogg的
通用注意事项
- 采样率优先选48kHz,这是Opus的原生最优采样率,其他采样率(如44.1kHz)也支持,但会有额外的转换开销。
- 双声道PCM必须是交错格式(左声道采样后紧跟右声道采样),PyAudio的paInt16格式默认就是这种,无需额外处理。
- Opus是有损编码,比特率越高音质越好,一般场景下双声道128-192kbps足够,语音场景可低至64kbps。
内容的提问来源于stack exchange,提问作者ProcgerXacker
相关产品推荐
相关产品推荐

