1. 特定平台的元素
1.1 目标
尽管GStreamer是一个跨平台的框架,但并非所有元素都适用于所有平台。例如,视频输出依赖于底层窗口系统,因此需要根据平台选择不同的视频输出。当使用像playbin
或autovideosink
这样的元素时,通常不需要担心这个问题,但是在需要使用仅适用于特定平台的输出元素时,本教程会向您介绍一些它们的特殊性。
1.2 跨平台
1.2.1 glimagesink
该视频输出元素基于OpenGL或OpenGL ES。它支持对缩放图像进行重采样和滤波以减轻混叠效应。它实现了VideoOverlay
接口,因此视频窗口可以重新定位(嵌入到其他窗口中)。这是大多数平台上推荐的视频输出元素,除了Windows平台(在Windows上推荐使用d3d11videosink)。特别是在Android和iOS上,它是唯一可用的视频输出元素。它可以通过glupload!glcolorconvert!glimagesinkelement
进行分解,以在流水线中插入进一步的OpenGL硬件加速处理。
1.3 Linux
1.3.1 ximagesink
基于X Window的标准RGB视频输出。它实现了VideoOverlay
接口,因此视频窗口可以重新定位(嵌入到其他窗口中)。它不支持除RGB以外的其他缩放或颜色格式;可以使用其他方法来执行这些操作(例如使用videoscale
元素)。
1.3.2 xvimagesink
基于X Window的视频输出,使用X Video Extension(Xv)。它实现了VideoOverlay
接口,因此视频窗口可以重新定位(嵌入到其他窗口中)。它可以在GPU上高效地进行缩放。只有在硬件和对应的驱动程序支持Xv扩展时才可用。
1.3.3 alsasink
该音频输出通过ALSA(Advanced Linux Sound Architecture)输出到声卡。这个输出在几乎所有Linux平台上都可用。它通常被视为与声卡交互的“低级”接口,并且可能配置复杂(参见《Playback tutorial 9: Digital audio pass-through》中的注释)。
1.3.4 pulsesink
该输出将音频播放到PulseAudio
服务器。它比ALSA更高级的抽象层次接口,因此更容易使用并提供更高级的功能。但是,已知在一些较旧的Linux发行版上不稳定。
1.4 Mac OS X
1.4.1 osxvideosink
这是在Mac OS X上可用的视频输出元素。也可以使用OpenGL使用glimagesink
进行绘制。
1.4.2 osxaudiosink
这是在Mac OS X上唯一可用的音频输出元素。
1.5 Windows
1.5.1 d3d11videosink
该视频输出元素基于Direct3D11,是Windows平台上推荐的元素。它支持VideoOverlay
接口,并以零拷贝方式进行缩放和颜色空间转换。该元素是Windows平台上性能最好、功能最丰富的视频输出元素。
1.5.2 d3dvideosink
该视频输出元素基于Direct3D9。它支持对缩放图像进行重采样和滤波以减轻混叠效应。它实现了VideoOverlay
接口,因此视频窗口可以重新定位(嵌入到其他窗口中)。不推荐在针对Windows 8或更高版本的应用程序中使用此元素。
1.5.3 dshowvideosink(已弃用)
该视频输出元素基于Direct Show。它可以使用不同的渲染后端,如EVR、VMR9或VMR7,其中EVR仅适用于Windows Vista或更高版本。它支持对缩放图像进行重采样和滤波以减轻混叠效应。它实现了VideoOverlay
接口,因此视频窗口可以重新定位(嵌入到其他窗口中)。在大多数情况下,不推荐使用此元素。
1.5.4 wasapisink和wasapi2sink
这些元素是Windows上默认的音频输出元素,基于WASAPI,可在Vista或更高版本中使用。请注意,wasapi2sink
是wasapisink
的替代品,并且在Windows 8或更高版本上是默认的音频输出元素。否则,wasapisink将是默认的音频输出元素。
1.5.5 directsoundsink(已弃用)
该音频输出元素基于DirectSound,在所有Windows版本中都可用。
1.5.6 dshowdecwrapper
Direct Show是一种类似于GStreamer的多媒体框架。它们之间有足够的差异,无法将它们的流水线相互连接。但是,通过该元素,GStreamer可以从Direct Show中的解码器中获益。dshowdecwrapper
将多个Direct Show解码器封装起来,以便将其嵌入到GStreamer流水线中。使用gst-inspect-1.0
工具(参见《Basic tutorial 10: GStreamer tools》)查看可用的解码器。
1.6 Android
1.6.1 openslessink
这是在Android上GStreamer可用的唯一音频输出元素。它基于OpenSL ES。
1.6.2 openslessrc
这是在Android上GStreamer可用的唯一音频源元素。它基于OpenSL ES。
1.6.3 androidmedia
android.media.MediaCodec是一个特定于Android的API,可访问设备上可用的编解码器,包括硬件编解码器。它从API级别16(JellyBean)开始提供,并且GStreamer可以通过androidmedia插件来使用它进行音频和视频解码。在Android上,将硬件解码器连接到glimagesink元素可以产生高性能的零拷贝decodebin流水线。
1.6.4 ahcsrc
这个视频源可以从Android设备的摄像头中捕获,它是androidmedia插件的一部分,使用android.hardware.Camera API。
1.7 iOS
1.7.1 osxaudiosink
这是在iOS上GStreamer可用的唯一音频输出元素。
1.7.2 iosassetsrc
这是一个读取iOS资源的源元素,即存储在库中的文档(如照片、音乐和视频)。当URI使用assets-library://方案时,playbin
可以自动实例化它。
1.7.3 iosavassetsrc
这是一个读取和解码iOS音视频资源的源元素,即存储在库中的文档(如照片、音乐和视频)。当URI使用ipod-library://方案时,playbin
可以自动实例化它。解码由系统执行,因此如果可用,将使用专用硬件进行解码。
1.8 结论
本教程展示了一些GStreamer元素的特定细节,这些元素并非在所有平台上都可用。当使用像playbin
或autovideosink
这样的跨平台元素时,您无需担心这些细节,但是如果需要手动实例化这些元素,了解它们的特殊性是很好的。