官网地址
Basic tutorial 16: Platform-specific elements
一、目标
尽管 GStreamer 是一个跨平台的框架,但并非所有元素在所有平台上都可用。例如,视频接收器(video sink)严重依赖于底层的窗口系统,因此需要根据平台选择不同的接收器。在使用 playbin 或 autovideosink 等元素时,通常不需要担心这个问题,但在某些情况下,如果你需要使用仅在特定平台上可用的接收器,本教程将为你提供一些相关的提示。
二、跨平台
2.1、glimagesink
这是一个基于 OpenGL 或 OpenGL ES 的视频接收器。它支持重新缩放和缩放图像的过滤,以减少锯齿。它实现了 VideoOverlay 接口,因此视频窗口可以重新嵌入到其他窗口中。这是在大多数平台上推荐的视频接收器(Windows 除外,Windows 上推荐使用 d3d11videosink)。特别是在 Android 和 iOS 上,它是唯一可用的视频接收器。它可以分解为 glupload ! glcolorconvert ! glimagesinkelement,以便在管道中插入更多的 OpenGL 硬件加速处理。
三、Linux
3.1、ximagesink
这是一个标准的基于 X 的 RGB 视频接收器。它实现了 VideoOverlay 接口,因此视频窗口可以重新嵌入到其他窗口中。它不支持缩放或 RGB 以外的颜色格式;必须通过其他方式(例如使用 videoscale 元素)来执行这些操作。
3.2、xvimagesink
这是一个基于 X 的视频接收器,使用 X Video Extension (Xv)。它实现了 VideoOverlay 接口,因此视频窗口可以重新嵌入到其他窗口中。它可以在 GPU 上高效执行缩放。只有在硬件和相应驱动程序支持 Xv 扩展时,它才可用。
3.3、alsasink
这个音频接收器通过 ALSA(高级 Linux 声音架构)输出到声卡。这个接收器在几乎所有的 Linux 平台上都可用。它通常被视为声卡的“低级”接口,配置起来可能比较复杂(参见播放教程 9:数字音频直通的注释)。
3.4、pulsesink
这个接收器将音频播放到 PulseAudio 服务器。它是比 ALSA 更高级的声卡抽象,因此更易于使用并提供更高级的功能。不过,在某些较旧的 Linux 发行版上,它可能不太稳定。
四、Mac OS X
4.1、osxvideosink
这是 Mac OS X 上 GStreamer 可用的视频接收器。也可以使用 OpenGL 的 glimagesink 进行绘制。
4.2、osxaudiosink
这是 Mac OS X 上 GStreamer 唯一可用的音频接收器。
五、Windows
5.1、d3d11videosink
这个视频接收器基于 Direct3D11,是 Windows 上推荐使用的元素。它支持 VideoOverlay 接口,并以零拷贝方式支持重新缩放/颜色空间转换。这个元素是 Windows 上性能最好、功能最丰富的视频接收器。
5.2、d3dvideosink
这个视频接收器基于 Direct3D9。它支持重新缩放和缩放图像的过滤,以减少锯齿。它实现了 VideoOverlay 接口,因此视频窗口可以重新嵌入到其他窗口中。对于针对 Windows 8 或更高版本的应用程序,不推荐使用此元素。
5.3、dshowvideosink(已弃用)
这个视频接收器基于 Direct Show。它可以使用不同的渲染后端,如 EVR、VMR9 或 VMR7,其中 EVR 仅在 Windows Vista 或更高版本上可用。它支持重新缩放和缩放图像的过滤,以减少锯齿。它实现了 VideoOverlay 接口,因此视频窗口可以重新嵌入到其他窗口中。在大多数情况下,不推荐使用此元素。
5.4、wasapisink 和 wasapi2sink
这些元素是 Windows 上基于 WASAPI 的默认音频接收器,WASAPI 在 Vista 或更高版本上可用。请注意,wasapi2sink 是 wasapisink 的替代品,并且在 Windows 8 或更高版本上是默认的音频接收器。否则,wasapisink 将是默认的音频接收器。
5.5、directsoundsink(已弃用)
这个音频接收器基于 DirectSound,它在所有 Windows 版本中都可用。
5.6、dshowdecwrapper
Direct Show 是一个类似于 GStreamer 的多媒体框架。但它们之间的差异较大,因此它们的管道无法直接连接。然而,通过这个元素,GStreamer 可以利用 Direct Show 中的解码元素。dshowdecwrapper 封装了多个 Direct Show 解码器,以便它们可以嵌入到 GStreamer 管道中。使用 gst-inspect-1.0 工具(参见基础教程 10:GStreamer 工具)查看可用的解码器。
五、Android
5.1、openslessink
这是 Android 上 GStreamer 唯一可用的音频接收器。它基于 OpenSL ES。
5.2、openslessrc
这是 Android 上 GStreamer 唯一可用的音频源。它基于 OpenSL ES。
5.3、androidmedia
android.media.MediaCodec 是一个 Android 特定的 API,用于访问设备上可用的编解码器,包括硬件编解码器。它自 API 级别 16(JellyBean)起可用,GStreamer 可以通过 androidmedia 插件使用它进行音频和视频解码。在 Android 上,将硬件解码器附加到 glimagesink 元素可以生成高性能的零拷贝 decodebin 管道。
5.4、ahcsrc
这个视频源可以从 Android 设备的摄像头捕获视频,它是 androidmedia 插件的一部分,并使用 android.hardware.Camera API。
六、iOS
6.1、osxaudiosink
这是 iOS 上 GStreamer 唯一可用的音频接收器。
6.2、iosassetsrc
这是一个用于读取 iOS 资产的源元素,即存储在库中的文档(如照片、音乐和视频)。当 URI 使用 assets-library:// 方案时,它可以由 playbin 自动实例化。
6.3、iosavassetsrc
这是一个用于读取和解码 iOS 音视频资产的源元素,即存储在库中的文档(如照片、音乐和视频)。当 URI 使用 ipod-library:// 方案时,它可以由 playbin 自动实例化。解码由系统执行,因此如果有专用硬件,将使用硬件解码。
七、结论
本教程展示了一些 GStreamer 元素的特定细节,这些元素并非在所有平台上都可用。在使用跨平台元素(如 playbin 或 autovideosink)时,你不需要担心这些问题,但如果手动实例化它们,了解它们的特性是很有帮助的。