Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Gstreamer接收视频:流任务已暂停,原因未协商(-4)_C_Video Streaming_Gstreamer_Rtp - Fatal编程技术网

C Gstreamer接收视频:流任务已暂停,原因未协商(-4)

C Gstreamer接收视频:流任务已暂停,原因未协商(-4),c,video-streaming,gstreamer,rtp,C,Video Streaming,Gstreamer,Rtp,我正在尝试通过UDP协议通过网络传输RTP视频流 以下是发送方端的管道代码: 如果我用gst-launch-1.0这样的命令行运行receiver,我可以接收和查看实际视频: gst-launch-1.0 -v udpsrc address=127.0.0.1 port=1234 caps="application/x-rtp" ! rtph263pdepay ! avdec_h263 ! autovideosink 但当我在c代码中为同一管道执行接收器时,我看不到有视频的窗口。 以下是接收

我正在尝试通过UDP协议通过网络传输RTP视频流

以下是发送方端的管道代码:

如果我用
gst-launch-1.0
这样的命令行运行receiver,我可以接收和查看实际视频:

gst-launch-1.0 -v udpsrc address=127.0.0.1 port=1234 caps="application/x-rtp" ! rtph263pdepay ! avdec_h263 ! autovideosink
但当我在c代码中为同一管道执行接收器时,我看不到有视频的窗口。 以下是接收器端的管道代码(完整-因为我相信这里有错误):

代码中提供的错误:

WARN    basesrc gstbasesrc.c:2943:void gst_base_src_loop(GstPad *):<source> error: Internal data flow error. 
WARN    basesrc gstbasesrc.c:2943:void gst_base_src_loop(GstPad *):<source> error: streaming task paused, reason not-negotiated (-4) 
ERROR   default gstreamer_utils.c:42:on_error: Error received from element source: Internal data flow error.
WARN basesrc gstbasesrc.c:2943:void gst_base_src_loop(GstPad*):错误:内部数据流错误。
WARN basesrc gstbasesrc.c:2943:void gst_base_src_loop(GstPad*):错误:流任务暂停,原因未协商(-4)
错误默认gstreamer_utils.c:42:on_错误:从元素源收到的错误:内部数据流错误。

我如何调试这个问题?

这太长了,无法发表评论-这不是答案,而是如何分析:

尝试制作点文件以发现差异。。我在日志中注意到有opengl的东西,你需要吗?尝试将autovideosink更改为不使用opengl的内容。。不确定你在Mac上有什么选择(我希望我猜对了)——在Linux上我使用ximagesink或ximagesink。。在Mac上有osxvideosink(不确定默认情况下是否构建)-您可以检查

我猜,为什么gst启动和你的应用程序表现不同,是因为你的应用程序中有一些额外的开销,这会导致处理速度变慢或出现其他情况,而当某些事情延迟时,你会得到未协商的错误

我在日志中注意到:

0:00:00.608577000 29168 0x7fb5a401d850信息基础gstbasesrc.c:2838:void gst_base_src_loop(GstPad*):标记待定不连续

这意味着一些数据包比预期的来得晚,并且被丢弃

尝试在udpsrc之后添加队列,该队列将缓冲少量数据包:

queue = gst_element_factory_make ("queue", "srcqueue");
当然,还要添加到管道和连接之间:

if (gst_element_link_many (source, queue
            rtph263pdepay, h263p, sink, NULL) != TRUE) {

我在建造RTP H264管道时遇到了同样的警告,我可以修复它

gst-launch-1.0 -v udpsrc port=5004 caps="application/x-rtp,media=(string)video,encoding-name=(string)H264,payload=(int)96" ! rtpjitterbuffer ! rtph264depay ! decodebin ! videoconvert ! autovideosink
gst的发布一切顺利,但在C中它并没有启动流

我在日志文件中有相同的警告,并搜索“未协商”的原因

结果证明,我的caps配置错误/不完整。Gstreamer接受一切,在看到“未协商”消息之前不会抱怨

您应该仔细检查所有元素的配置是否正确。 我必须比较gst启动和应用程序日志消息以找到解决方案

顺便说一句,这是我的测试源代码流,我使用的是windows,gstreamer版本1.14.4

gst-launch-1.0 -v videotestsrc ! video/x-raw,framerate=20/1 ! videoscale ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=127.0.0.1 port=5004

我想到了两件事-与您的启动管道相比,您有额外的
sync=false
,第二件。。另外,尝试在sink元素上设置GST_STATE_PLAYING alson(但这不是很好的建议,只是在黑暗中拍摄)。。您可以通过导出或运行
GST\u debug=4./yourapp
来调试解决方案。。然后更新问题或了解链接时间内发生的情况(您得到的是“未协商”,这意味着在运行时无法链接这些修订内容)谢谢,@otopolsky我在没有sync=false和GST_DEBUG=4的情况下运行了此程序,获得了一些日志:知道在哪里寻找线索吗?
gst-launch-1.0 -v videotestsrc ! video/x-raw,framerate=20/1 ! videoscale ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=127.0.0.1 port=5004