官网地址
Playback tutorial 9: Digital audio pass-through
一、目标
本教程展示了 GStreamer 如何处理数字音频直通。
二、介绍
除了常见的模拟格式外,高端音频系统通常还接受数字形式的音频数据,无论是压缩的还是未压缩的。这很方便,因为音频信号从计算机传输到扬声器时,以更抗干扰和噪声的形式传输,从而获得更高的质量。
连接通常通过 S/PDIF 电缆进行,该电缆可以是光缆(带有 TOSLINK 连接器)或同轴电缆(带有 RCA 连接器)。S/PDIF 也被称为 IEC 60958 类型 II(1998 年之前称为 IEC 958)。
在这种情况下,GStreamer 不需要执行音频解码;它可以简单地输出编码数据,以直通模式运行,并让外部音频系统执行解码。
三、GStreamer 音频接收器的内部工作原理
首先,必须在系统级别启用数字音频输出。实现此操作的方法取决于操作系统,但通常涉及进入音频控制面板并激活一个标有“数字音频输出”或类似内容的复选框。
每个平台的主要 GStreamer 音频接收器,Linux 的 Pulse Audio(pulsesink)、OS X 的 osxaudiosink 和 Windows 的 Direct Sound(directsoundsink),在检测到数字音频输出可用时,会相应地更改其输入 caps 以接受编码数据。例如,这些元素通常接受 audio/x-raw 数据:当系统中启用数字音频输出时,它们可能还会接受 audio/mpeg、audio/x-ac3、audio/x-eac3 或 audio/x-dts。
然后,当 playbin 构建解码管道时,它会意识到音频接收器可以直接连接到编码数据(通常来自解复用器),因此不需要解码器。此过程是自动的,应用程序无需执行任何操作。
在 Linux 上,还存在其他音频接收器,如 Alsa(alsasink),它们的工作方式不同(需要通过接收器的设备属性手动选择“数字设备”)。不过,Pulse Audio 是 Linux 上通常首选的音频接收器。
四、数字格式的注意事项
当在系统级别启用数字音频输出时,GStreamer 音频接收器会自动暴露所有可能的数字音频 caps,而不管 S/PDIF 电缆末端的实际音频解码器是否能够解码所有这些格式。这是因为没有机制可以查询外部音频解码器支持哪些格式,而且事实上,电缆甚至可能在此过程中断开连接。
例如,在系统的控制面板中启用数字音频输出后,directsoundsink 会自动暴露 audio/x-ac3、audio/x-eac3 和 audio/x-dts caps,以及 audio/x-raw。然而,某个特定的外部解码器可能只理解原始整数流,并会尝试播放压缩数据(这对您的耳朵来说是一种痛苦的体验,请放心)。
解决此问题需要用户干预,因为只有用户知道外部解码器支持的格式。
在某些系统上,最简单的解决方案是向操作系统告知外部音频解码器可以接受的格式。这样,GStreamer 音频接收器将仅提供这些格式。通常可以从操作系统的音频配置面板中选择可接受的音频格式,从启用数字音频输出的同一位置选择,但不幸的是,并非所有音频驱动程序都提供此选项。
另一种解决方案涉及使用自定义 sinkbin(参见播放教程 7:自定义 playbin 接收器),其中包括一个 capsfilter 元素(参见基础教程 14:实用元素)和一个音频接收器。然后,将外部解码器支持的 caps 设置在 capsfilter 中,以便不会输出错误的格式。这允许应用程序强制执行适当的格式,而不是依赖用户正确配置系统。仍然需要用户干预,但无论音频驱动程序提供什么选项,都可以使用。
请不要使用 autoaudiosink 作为音频接收器,因为它目前仅支持原始音频,并且会忽略任何压缩格式。
五、结论
本教程展示了 GStreamer 如何处理数字音频。特别是,它展示了:
- 使用 playbin 的应用程序无需执行任何特殊操作来启用数字音频输出:它由操作系统的音频控制面板管理。