我很难理解如何构建gstreamer管道。我已经在Google和stackoverflow上阅读了许多与我的问题非常相似的问题,但是大多数问题都以为我知道我在做什么,而事实并非如此。
我正在阅读文档,但是阅读文档并生成有效的管道似乎是完全不同的事情,而我的失败了。
我正在使用gst-launch-1.0发送此管道:
gst-launch-1.0 videotestsrc ! video/x-raw,width=640,height=480 ! \
videoconvert ! x264enc ! rtph264pay ! udpsink host=127.0.0.1 port=5600
并且我正在尝试使用gst_parse_launch通过以下管道在C应用程序中显示和记录管道:
udpsrc port=5600 ! application/x-rtp, clock-rate=90000,payload=96 \
! rtph264depay ! video/x-h264 ! queue ! h264parse !
tee name=qgc
qgc. ! queue ! decodebin ! glupload ! glcolorconvert ! qmlglsink name=sink
qgc. ! queue ! mp4mux ! filesink location=bleh.mp4
此管道可以正确显示视频,但生成的文件在磁盘中完全为空。
由于Gstreamer存在很多非常相似的问题,因此我想提出一些问题,以帮助我以后不再问这个问题。
0-管道是否正确编写?发球区的参考有点奇怪,我不确定我是否正确使用它们。
1-如何发现管道中的问题?是否可以使用任何类型的调试器来粘贴管道并让pipeline compiler
告诉我是否一切正常-或者至少我创建的管道中存在明显的缺陷(例如缺少大写字母或不兼容)端口)
2-如何解决该管道问题,以接收视频(正确播放)并将其保存在磁盘中?我很确定这很简单,但是我没有弄清楚。
针对类似问题的其他答案大部分是删除可在用户的ccomputer上运行的管道,而在旧版本的gstreamer中,该管道今天不再可用。 抱歉,我的文字太长了。
圣诞节快乐。
答案 0 :(得分:1)
从the documentation开始,mp4mux需要一个EOF才能正确完成文件,您可以使用gst-launch-1.0 -e udpsrc port=5600 ! ...
强制EOF
以下是不带tee / qmlsink管道的示例:
gst-launch-1.0 -e udpsrc port=5600 ! application/x-rtp, clock-rate=90000,payload=96 \
! rtph264depay ! video/x-h264 ! queue ! h264parse ! queue ! mp4mux ! filesink location=bleh.mp4
您也可以在C中使用此代码强制EOF:
gst_element_send_event(pipeline, gst_event_new_eos())
答案 1 :(得分:0)
您可以看到我们需要在此处发送一个eos事件:https://github.com/mavlink/qgroundcontrol/blob/master/src/VideoStreaming/VideoReceiver.cc#L822
答案 2 :(得分:0)
HOST=192.168.31.175
发件人:
gst-launch-1.0 -v videotestsrc ! x264enc ! rtph264pay ! udpsink port=5000 host=$HOST
接收器(同时显示和记录):
gst-launch-1.0 -v udpsrc port=5000 ! "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" \
! rtph264depay ! h264parse \
! tee name=t \
t. ! queue ! mp4mux ! filesink location=xyz.mp4 -e \
t. ! queue leaky=1 ! decodebin ! videoconvert ! autovideosink sync=false
注意:
filesink location=xyz.mp4 -e
中的-e
(EOS信号):用于保存文件的管道需要可靠的EOS(流结束)信号queue leaky=1
和sync=false
:使渲染队列不阻塞