Gstreamer 与 videoconvert 协商
Gstreamer negotiation with videoconvert
将 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) 那么我们必须转换 [=16= 的格式] 来匹配过滤器。
另一方面,如果autovideosink
的格式不匹配过滤器(宽度=640,高度=480),那么我们必须在过滤器之后立即进行转换。
因此,我认为只有 (2) 或 (3) 应该有效,但不能同时有效。
(2) 和 (3) 可以工作,因为这实际上可能是您视频格式的问题。可能的原因是您的相机产生了某种格式,而您的视频接收器无法接受它。在中间添加 videoconvert
使其从一个转换为另一个,他们很高兴。
为了协商,videoconvert
获取下游上限并将它们传播到上游,除了它注入的格式比下游可以处理的格式更多,因为它可以接受不同的格式然后进行转换。维度和帧率保持原样,因为该管道中的任何内容都无法缩放或更改速率。
如果您 运行 带有 -v
标志的工作管道,它应该打印实际协商的上限,然后您可以看到 v4l2src 在其源垫上产生什么以及视频接收器在其接收器中接收什么软垫。然后你可以看到 videoconvert 到底在转换什么。
将 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) 那么我们必须转换 [=16= 的格式] 来匹配过滤器。
另一方面,如果autovideosink
的格式不匹配过滤器(宽度=640,高度=480),那么我们必须在过滤器之后立即进行转换。
因此,我认为只有 (2) 或 (3) 应该有效,但不能同时有效。
(2) 和 (3) 可以工作,因为这实际上可能是您视频格式的问题。可能的原因是您的相机产生了某种格式,而您的视频接收器无法接受它。在中间添加 videoconvert
使其从一个转换为另一个,他们很高兴。
为了协商,videoconvert
获取下游上限并将它们传播到上游,除了它注入的格式比下游可以处理的格式更多,因为它可以接受不同的格式然后进行转换。维度和帧率保持原样,因为该管道中的任何内容都无法缩放或更改速率。
如果您 运行 带有 -v
标志的工作管道,它应该打印实际协商的上限,然后您可以看到 v4l2src 在其源垫上产生什么以及视频接收器在其接收器中接收什么软垫。然后你可以看到 videoconvert 到底在转换什么。