Gstreamer与视频转换协商

时间:2017-04-05 14:53:12

标签: video video-streaming gstreamer

videoconvertgst-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)可以工作,但不能同时工作。

1 个答案:

答案 0 :(得分:1)

(2)和(3)可以正常工作,因为这实际上可能是您视频格式的问题。可能的原因是您的相机产生了某种格式,而您的视频接收器无法接受它。在中间添加videoconvert使其从一个转换为另一个,并且他们很高兴。

要进行协商,videoconvert获取下游上限并将其传播到上游,除了它注入的格式比下游可以处理的格式多,因为它可以接受不同的格式,然后转换。维度和帧率保持原样,因为该管道中的任何内容都无法扩展或更改速率。

如果您使用-v标志运行工作管道,它应该打印实际协商的上限,然后您可以看到v4l2src在其源焊盘上产生的内容以及视频接收器在其接收器中接收的内容。然后你就可以看到videoconvert到底转换了什么。