4. 音频格式转换
任务目标
构建一条GStreamer管道,将音频从S16LE(有符号16位小端)格式转换为F32LE(32位浮点小端),并将转换后的音频数据写入文件,以验证格式转换的正确性。
环境依赖
需要GStreamer核心库及音频插件(gst-plugins-base),通常随GStreamer运行时默认安装。若缺失,在Debian/Ubuntu下执行:
sudo apt install gstreamer1.0-plugins-base gstreamer1.0-tools
实现方案
使用audiotestsrc生成已知频率的正弦波测试音(S16LE格式),经audioconvert完成格式转换,再通过capsfilter强制指定输出为F32LE,最后用filesink写入文件。通过检查输出文件的caps元数据确认转换生效。
关键完整代码
# 生成测试音频并转换为F32LE写入文件
gst-launch-1.0 \
audiotestsrc freq=440 num-buffers=100 ! \
audio/x-raw, format=S16LE, rate=44100, channels=1 ! \
audioconvert ! \
audio/x-raw, format=F32LE ! \
filesink location=output_f32le.raw
运行与验证
运行管道:在终端执行上述命令。若管道成功,命令会在约0.23秒(100帧/44100Hz)后正常退出,无错误输出。
验证转换结果:使用gst-discoverer检查输出文件的媒体属性:
gst-discoverer-1.0 output_f32le.raw
在输出信息中查找Audio段落,确认以下字段:
format:F32LE(32位浮点小端)rate:44100channels:1
若显示F32LE,则说明audioconvert已成功将S16LE转换为F32LE。
附加验证(可选):用filesink写入的原始PCM数据可通过以下命令回放验证音频内容完整性:
gst-launch-1.0 filesrc location=output_f32le.raw ! \
audio/x-raw, format=F32LE, rate=44100, channels=1 ! \
audioconvert ! autoaudiosink
应听到440Hz的测试音,证明转换后的数据可被正确解码播放。
常见问题
- 管道启动失败:检查是否缺少
gst-plugins-base,或确认audiotestsrc元素可用(执行gst-inspect-1.0 audiotestsrc)。 - 输出文件为空:确认
num-buffers参数已设置,且filesink的location路径有写入权限。 - caps不匹配:若在
audioconvert后未指定caps,则输出格式可能为默认值。务必添加audio/x-raw, format=F32LE强制约束。