Video streaming Gstreamer:无法通过gst rtsp服务器完成与流媒体并行录制的视频

Video streaming Gstreamer:无法通过gst rtsp服务器完成与流媒体并行录制的视频,video-streaming,gstreamer,rtsp,matroska,Video Streaming,Gstreamer,Rtsp,Matroska,我正在开发一个Gstreamer(v1.14.4)应用程序,在该应用程序中,我通过RTSP提供实时视频流,并在设备上以不同的比特率记录它。为了服务RTSP流,我使用gst RTSP服务器。为了流式传输和记录,在我给RTSP服务器的lauch行中有一个tee和一个proxysink,第二个管道有一个proxysrc和一个filesink: RTPS管道: v4l2src --> tee --> proxysink |--> queue --&g

我正在开发一个Gstreamer(v1.14.4)应用程序,在该应用程序中,我通过RTSP提供实时视频流,并在设备上以不同的比特率记录它。为了服务RTSP流,我使用gst RTSP服务器。为了流式传输和记录,在我给RTSP服务器的lauch行中有一个
tee
和一个
proxysink
,第二个管道有一个
proxysrc
和一个
filesink

RTPS管道:

v4l2src --> tee  --> proxysink
                 |--> queue --> omxh264enc --> h264parse --> rtph264pay pt=96 name=pay0
proxysrc --> omxh264enc --> h264parse --> matroskamux --> filesink 
记录管道:

v4l2src --> tee  --> proxysink
                 |--> queue --> omxh264enc --> h264parse --> rtph264pay pt=96 name=pay0
proxysrc --> omxh264enc --> h264parse --> matroskamux --> filesink 
当客户端连接时,我链接RTSP媒体工厂的
“媒体配置”
回调中的两个代理元素。流式传输和写入文件都可以工作,除了文件不可查找之外,我认为这是因为它没有正确完成

当我从
GstRTSPClient
获得
“拆卸请求”
时,我试图通过调用以下函数来完成它(
CustomData
是一个结构,它包含指向我需要的所有Gstreamer元素的指针):

这里的一切都按预期进行,并打印了“在公交车上得到EOS”。但是,该文件不可查找。 除了上述函数中显示的内容外,我还尝试过:

  • 将EOS发送到FileLink元素本身,而不是发送到FileLink的sinkpad。然后我在总线上看不到消息(
    gst\u总线\u定时\u弹出\u过滤
    无限期挂起)
  • 将EOS发送到整个记录管道,而不是文件链接。再一次,车上没有EOS
  • 在确保记录管道处于播放状态后,尝试以上所有操作。这没什么区别
我以前成功地编写了正确定稿的视频文件,但从未与gst rtsp streamer结合使用。我怀疑问题就在这里,可能是因为录制管道在我尝试完成录制时没有从流媒体管道获取新数据

我做错了什么


谢谢您的帮助。

文件链接只是一个磁盘写入程序。这真是太糟了。将该值设置为EOS将无法修复任何问题。听起来你想把
matroskamux
设置为EOS,这样它就可以进行适当的定稿。这很有意义。我尝试将EOS发送到整个记录管道(从
proxysrc
开始),但随后信号似乎没有沿着管道传播(我从未在总线上看到它)。为什么会这样?不确定。也许在EOS被发送后,proxysrc会收到另一个帧,在EOS找到它的下落之前,它可能会发现意外和错误?@Nicolas我和你有相同的问题,结构类似。我可以停止单个管道并使用EOS完成,但我无法让它与proxysrc/sinks一起工作。你找到答案了吗?我查过了。。。如果您希望立即终止所有管道,则可以完全关闭,但如果您希望在保持发送管道运行的同时关闭proxysrc管道,则直接到管道的EOS将无法工作。Florian指出,直接将EOS发送到muxer可以完成这项工作,尽管不太美观,但它可以工作。
filesink
只是一个磁盘写入器。这真是太糟了。将该值设置为EOS将无法修复任何问题。听起来你想把
matroskamux
设置为EOS,这样它就可以进行适当的定稿。这很有意义。我尝试将EOS发送到整个记录管道(从
proxysrc
开始),但随后信号似乎没有沿着管道传播(我从未在总线上看到它)。为什么会这样?不确定。也许在EOS被发送后,proxysrc会收到另一个帧,在EOS找到它的下落之前,它可能会发现意外和错误?@Nicolas我和你有相同的问题,结构类似。我可以停止单个管道并使用EOS完成,但我无法让它与proxysrc/sinks一起工作。你找到答案了吗?我查过了。。。如果您希望立即终止所有管道,则可以完全关闭,但如果您希望在保持发送管道运行的同时关闭proxysrc管道,则直接到管道的EOS将无法工作。Florian指出,直接将EOS发送给muxer可以完成这项工作,尽管不美观,但它可以工作。