在Gstreamer中,通常“sink”插件可以将获取的视频流输出到显示器。
参考网站:http://trac.gateworks.com/wiki/Yocto/gstreamer/video#tearing
以下是iMX.6平台的输出sink列表:
-
gstreamer-imx
specific sinks-
imxg2dvideosink
-
imxipuvideosink
-
imxpxpvideosink
-
imxeglvivsink
-
-
Other GStreamer sinks
-
autovideosink
-
fbdevsink
-
fdsink
-
ximagesink/xvimagesink
-
fakesink
-
v4l2sink
-
如果需要更多,可以用 gst-inspect-1.0 | grep sink 命令查询。
imxg2dvideosink
这个视频接收器非常通用,可以输出任何大小的图像。它还可以转换图像(改变大小、旋转等),将图像放置在指定的位置,并可以接受以下视频格式:rgbx、bgrx、rgba、bgra、rgb16、nv12、nv21、i420、yv12、yuy2、uyvy。
对于绘制到显示器,这是我们推荐的gstreamer视频接收器。
imxg2dvideolink还支持垂直同步,以消除屏幕撕裂(screen tearing)。要启用此设置,将use-vsync属性设置为true。
屏幕撕裂:当视频输出与显示器的刷新率不同步时,会发生屏幕撕裂。将输出同步到刷新率的过程也称为“垂直同步”。
imxipuvideosink
这个视频接收器在输出尺寸上并没有那么通用。在许多情况下,它会拒绝一种格式并退出。但是,与imxg2dvideolink相比,它的一个优点是它包括一个去隔行器,可以接收更多的视频格式:rgb16、bgr、rgb、bgrx、bgr a、rgbx、rgba、abgr、uvy、v308、nv12、yv12、i420、y42b、y444。
只有在需要一个格式转换器来消除隔行扫描视频效果的影响时,或者,只有此视频接收器才能提供的某种视频格式时,才建议使用此插件。
设置插件属性 deinterlace=true 打开格式转换器。
imxpxpvideosink
此接收器仅在i.mx6solo和i.mx6dl处理器上可用。它可以做到与上述相同(减去有一个内置的逐行扫描),并支持以下视频格式:bgrx、rgb16、i420、yv12、y42b、nv12、yuy2、uyvy、yvyu。
如果资源有限,并且你需要将一些处理卸载到PXP引擎,则建议使用此插件。
可以设置属性 use-vsync=true,来避免屏幕撕裂。
imxeglvivsink
当您有x11显示器时,此接收器非常有用,并使用 Vivante direct textures 输出到主显示器。与imxipuvideosink一样,它具有灵活的输出视频格式列表:i420、yv12、nv12、nv21、uvy、rgb16、rgba、bgr a、rgbx、bgrx、bgr、argb、abgr、xrgb、xbgr。
当运行将输出到带有x11/wayland的显示器的管道时,建议使用此插件。要使用双缓冲(以消除撕裂),将FB_MULTI_BUFFER env变量设置为2。
autovideosink
在传统意义上,这个gstreamer接收器并不是真正的“视频”接收器。类似于Playbin和DecodeBin,这个插件会自动选择它认为最好的可用视频接收器(video sink)并使用这个sink。通常选择使用imxg2dvideolink,除非格式选择需要其他sink。通常不建议使用此插件,因为这个sink不能让开发者真正理解所用的管道(pipeline)。
fbdevsink
这个sink允许视频流直接输出到framebuffer上。
fdsink
这个sink允许你写入打开的文件描述符。
ximagexsink/xvimagesink
这些接收器使用标准的 Xlib API 调用输出到x11显示。xvimagesink用于xfree86视频输出。
fakesink
这是一个非常有用的视频接收器。这个sink需要给它任何帧,然后将它们丢弃。如果出现问题 ( It takes whatever frames is given to it and drops them),对管道的调试会有帮助。
关于上句的英文,在其他文档看到一个很好的解释帮助理解:fakesink是一个数据只进不出的“黑洞”。例如,一个视频文件一般包括视频流和音频流。如果设备只能播放音频(例如音箱),那么视频流对于设备来说,就是没有意义的东西。这时可以用fakesink插件将之吃掉。否则,由于GStreamer会在视频流和音频流之间进行同步,如果视频流没有被消耗,音频流也无法向前进。
gst-launch-1.0 videotestsrc pattern=0 ! fakesink
v4l2sink
在video4linux2设备上显示时,此接收器(video sink)非常有用。通常不用于基于IMX6的产品,除非所有其他水槽都出现故障。
补充一下 ximagesink 与 xvimagesink 和v4l2sink的区别
1. v4lsink, v4l2sink:video for linux的输出
2. ximagesink:使用XWindow输出,基本都支持
3. xvimagesink:使用XVideo extension输出,在ubuntu下要装一大堆库才支持
xvimagesink和v4lsink以及v4l2sink对视频输出的colorbalance做了处理,实现了Color Balance的接口,因此在利用上述视频输出插件时不需要做colorspace和videoscale的操作。
gst-launch filesrc location=xxx ! mpegdemux name=dmx dmx.video_00 ! queue ! mpeg2dec ! xvimagesink
反之,ximagesink必须要进行colorspace和videoscale的操作,才能正常输出。
gst-launch filesrc location=xxx ! mpegdemux name=dmx dmx.video_00 ! queue ! mpeg2dec ! ffmpegcolorspace ! videoscale ! ximagesink