如何用PyAudio直接保存录音为OGG格式?能否直接录制为OGG Vorbis?
直接用PyAudio录制并保存为OGG Vorbis格式的方案
PyAudio本身没有内置OGG Vorbis编码功能,无法直接替换原代码中的WAV保存逻辑,但可以借助第三方音频编码库,直接将录制得到的原始PCM音频数据编码为OGG Vorbis格式,跳过保存WAV的中间步骤。
方案一:使用pyogg库
pyogg是专门处理OGG系列格式的Python库,支持直接编码Vorbis:
- 先安装依赖:
pip install pyogg
- 修改原代码的保存部分:
import pyogg from struct import pack print("Recording started.") sample_width, data = record() channels = 1 # 与原代码一致的单声道配置 RATE = 44100 # 替换为你的实际采样率 # 打包PCM数据为字节流(与原代码逻辑一致) pcm_data = pack('<' + ('h'*len(data)), *data) # 初始化OGG Vorbis写入器 vorbis_writer = pyogg.VorbisWriter( path, # 输出路径,例如"recording.ogg" rate=RATE, channels=channels ) # 写入并关闭文件 vorbis_writer.write(pcm_data) vorbis_writer.close() print(f"Finished recording {path}") results["finished"] = True
方案二:使用soundfile库
soundfile是通用音频处理库,支持多种格式(包括OGG Vorbis),需要依赖libsndfile:
- 安装依赖:
pip install soundfile
注意:Linux系统可能需要先安装系统依赖sudo apt-get install libsndfile1-dev
- 修改原代码的保存部分:
import soundfile as sf import numpy as np print("Recording started.") sample_width, data = record() RATE = 44100 # 替换为你的实际采样率 # 将PCM列表转换为numpy数组(soundfile要求的格式) pcm_array = np.array(data, dtype=np.int16) # 16位采样对应int16类型 # 直接保存为OGG Vorbis sf.write( path, pcm_array, samplerate=RATE, format='OGG', subtype='VORBIS' ) print(f"Finished recording {path}") results["finished"] = True
注意事项
- 确保
record()函数返回的data是原始PCM采样数据(整数列表或数组),采样宽度与代码中的数据类型匹配(如16位对应int16) - 根据实际录制的采样率、声道数调整代码中的对应参数
内容的提问来源于stack exchange,提问作者Philosopho
相关产品推荐
相关产品推荐

