GStreamer Playback tutorial 学习笔记(九)

数字音频传输

目标
本教程展示了GStreamer如何处理数字音频传输。

简介
除了常见的模拟格式外,高端音频系统通常还接受数字形式的数据,无论是压缩还是未压缩。这是很方便的,因为音频信号以这种形式从计算机传输到扬声器,对干扰和噪音更具韧性,从而提高音质。

连接通常是通过一个S/PDIF电缆完成的,这个电缆可以是光学的(使用TOSLINK连接器)或同轴的(使用RCA连接器)。S/PDIF也被称为IEC 60958 type 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-raw外,还会自动公开audio/x-ac3、audio/x-eac3和audio/x-dts caps。然而,特定的外部解码器可能只能理解原始整数流,并将尝试播放压缩数据(这对您的耳朵来说是非常痛苦的经历,请放心)。

解决这个问题需要用户干预,因为只有用户知道外部解码器支持的格式。

在某些系统上,最简单的解决方案是通知操作系统外部音频解码器可以接受的格式。通过这种方式,GStreamer音频汇将仅提供这些格式。通常可以从操作系统的音频配置面板中选择可接受的音频格式,与启用数字音频输出的位置相同,但不幸的是,这个选项并不适用于所有音频驱动程序。

另一种解决方案是使用自定义的sinkbin(参见播放教程7:自定义playbin汇流箱),其中包括一个capsfilter元素(参见基本教程14:方便的元素)和一个音频汇。然后,在capsfilter中设置外部解码器支持的caps,以避免输出错误的格式。这允许应用程序强制使用适当的格式,而不是依赖用户正确配置系统。尽管仍然需要用户干预,但可以使用不论音频驱动程序提供的选项如何。

请不要使用autoaudiosink作为音频汇,因为它当前仅支持原始音频,并且会忽略任何压缩格式。

结论
本教程展示了GStreamer`处理数字音频的一点内容。特别是,它展示了以下内容:

使用playbin的应用程序无需进行任何特殊操作即可启用数字音频输出:它是从操作系统的音频控制面板管理的。

你可能感兴趣的:(GStreamer学习笔记,GStreamer,服务器,webrtc,c++)