将videoconvert
与gst-launch
一起使用时,我们会遇到意外行为:
在执行下面的选项(1)时,我们会收到错误:
gst-launch-1.0 v4l2src ! 'video/x-raw, width=640, height=480, framerate=30/1' ! autovideosink
错误是:
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data flow error. Additional debug info: gstbasesrc.c(2865): gst_base_src_loop():/GstPipeline:pipeline0/GstV4l2Src:v4l2src0: streaming task paused, reason not-negotiated (-4)
错误确实有意义,因为过滤器的格式可能与v4l2src
的格式或autovideosink
的格式不匹配。
但是通过在下面的两个选项(2& 3)中使用videoconvert,它可以正常运行而没有任何错误:
我看到下面的选项(2)没有任何错误:
gst-launch-1.0 v4l2src ! videoconvert ! 'video/x-raw, width=640, height=480, framerate=30/1' ! autovideosink
我也看到下面的选项(3)没有任何错误:
gst-launch-1.0 v4l2src ! 'video/x-raw, width=640, height=480, framerate=30/1' ! videoconvert ! autovideosink
问题是为什么两种情况都有效(2& 3)。
我认为它应该仅适用于其中一个,因为如果v4l2src
的src与filter不匹配(width = 640,height = 480),那么我们必须将v4l2src
的格式转换为匹配过滤器。
另一方面,如果autovideosink
的格式与过滤器(宽度= 640,高度= 480)不匹配,那么我们必须在过滤器后立即进行转换。
所以,我认为只有(2)或(3)可以工作,但不能同时工作。
答案 0 :(得分:1)
(2)和(3)可以正常工作,因为这实际上可能是您视频格式的问题。可能的原因是您的相机产生了某种格式,而您的视频接收器无法接受它。在中间添加videoconvert
使其从一个转换为另一个,并且他们很高兴。
要进行协商,videoconvert
获取下游上限并将其传播到上游,除了它注入的格式比下游可以处理的格式多,因为它可以接受不同的格式,然后转换。维度和帧率保持原样,因为该管道中的任何内容都无法扩展或更改速率。
如果您使用-v
标志运行工作管道,它应该打印实际协商的上限,然后您可以看到v4l2src在其源焊盘上产生的内容以及视频接收器在其接收器中接收的内容。然后你就可以看到videoconvert到底转换了什么。