Gstreamer 保存H264编码流,无需重新编码

Gstreamer 保存H264编码流,无需重新编码,gstreamer,Gstreamer,我有一个gstreamer管道,它使用以下方式进行流式处理: v4l2src ! x264enc ! rtph264pay pt=96 ! udpsink host=ip port=8554 以及接收该流的管道: / queue ! avdec_h264 ! appsink udpsrc ! capsfilter ! rtpjitterbuffer ! r

我有一个gstreamer管道,它使用以下方式进行流式处理:

v4l2src ! x264enc ! rtph264pay pt=96 ! udpsink host=ip port=8554
以及接收该流的管道:

                                                                /   queue !     avdec_h264 ! appsink
udpsrc ! capsfilter ! rtpjitterbuffer ! rtph264depay ! tee ! 
                                                                \   queue ! h264parse ! mp4mux ! filesink
不带三通的简化接收管线为:

gst-launch-1.0 udpsrc port=8080 caps="lots-of-caps" ! rtpjitterbuffer ! rtph264depay ! h264parse ! mp4mux ! filesink location=/home/rish/Desktop/recorded.264 -e 
问题: 有没有一种方法可以保存从udpsrc接收的H264编码流而无需重新编码?如何正确关闭文件链接

到目前为止我所尝试的:来自线程的讨论表明我在上面尝试了管道,但文件仍然损坏。(未正确关闭)


问题问了一个类似的问题。然而,我不想解码和重新编码。线程中的另一个答案建议使用matroskamux元素而不是mp4mux。这是可行的,但我更喜欢使用mp4mux(没有特别的原因,但我想知道为什么matroskamux可以工作而mp4mux不能工作)。

您的管道已经在无需重新编码的情况下进行多路复用,管道上没有编码器
h264parse
只是一个解析器


您已经得到了关于如何关闭流的答案:

我建议您查看
splitmuxsink
元素。是的,但是我提到的管道不起作用。一旦我使用第一个管道(udpsink)启动流,并使用第二个管道接收,保存的文件就会损坏/无法播放。用matroskamux替换muxer元素(mp4mux)时,保存的文件正确/可播放。另外,在这个稍微复杂的管道中发送EoS之后,我应该将EoS发送到哪个元素?接收器记录分支管道中没有编码器/解码器。明白了!在这种情况下,将EoS发送到muxer是有效的。对于任何想要查看源代码的人,请找到它。(非常感谢对代码的任何建议。)@thiagoss,非常感谢您的帮助!我仍然不知道为什么matroskamux可以工作,而mp4mux不能。当您将EOS正确地发送到muxer分支时,两者都应该工作。如果没有matroska,可能是因为它编写未完成文件的方式比mp4mux更具可恢复性,这主要是因为这些格式的工作方式。mp4mux是如何失败的?文件不可播放?当我将EoS发送到mp4mux时不工作。如果可以,请尝试运行我在问题中提到的命令行管道。如果我直接保存编码流,如果没有muxer,文件将无法播放(gst play抱怨“无法确定流的类型”),而且,我认为您是-matroskamux比mp4mux更具可恢复性。使用mp4mux保存的文件无法播放(gst播放投诉文件损坏)。matroskamux的文件是可播放的,但在最初的2-3秒钟内,有一块灰色/索贝尔边缘状的线。此外,保存的视频是不稳定的。如果没有muxer,它不应该生成可播放的文件,只有某些编解码器已经包含完全可解析的格式,大多数编解码器需要将其放入muxer中才能正确解释。