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: 44100
  • channels: 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强制约束。