我有两个轴的IP相机流H264流通过RTSP/RTP。两个摄像机都被设置为与相同的NTP服务器同步,因此我假设两个摄像机都有相同的精确时钟(在ms中可能略有差异)。
在我的应用程序中,两个摄像机都指向相同的视图,它需要处理同一时间的两个摄像机图像。因此,我希望使用GStreamer同步图像捕获。
我尝试在不同的cmd提示下分别调用两个管道,但视频间隔为2-3秒。

。
有人能建议一个gstreamer管道来同步两个H264流并将它们记录到单独的视频文件中吗?
谢谢!手臂
发布于 2016-06-03 17:47:49
我能够使用gst启动管道,如下所示。与两条流水线相比,该算法在捕获帧同步方面有了很好的改进。大多数情况下,它们相差0到500毫秒。尽管如此,我仍然希望它们的同步小于150毫秒的精度。
rtspsrc location=rtsp://192.168.16.136:554/axis-media/media.amp?videocodec=h264 \
! rtph264depay ! h264parse \
! splitmuxsink max-size-time=10000000000 location=axis/video_136_%d.mp4 \
rtspsrc location=rtsp://192.168.16.186:554/axis-media/media.amp?videocodec=h264 \
! rtph264depay ! h264parse \
! splitmuxsink max-size-time=10000000000 location=axis/video_186_%d.mp4感谢有人能指出其他的想法!
~臂
发布于 2016-06-01 06:33:00
同步是什么意思?如果记录到单独的视频文件,则不需要任何同步。因为这会把他们完全分开..。每个RT(S)P流将包含不同的时间戳,如果您想将它们以某种方式对齐到同一时间(我指的是真实的人类时间)。就像“两者都应该从15:00开始”),那么你必须以某种方式配置它们(这只是一个想法)。
你也没有告诉我们那些rtp/rtsp流里面的是什么(是MPEG、ts还是纯IP)。等)。因此,我将给出mpeg ts封装的rtp流的例子。我们将一步一步地走:
假设这是一台相机,只是为了展示它的外观:
gst-launch-1.0 -v videotestsrc ! videoconvert ! x264enc ! mpegtsmux ! rtpmp2tpay ! udpsink host=127.0.0.1 port=8888然后,这将是累赘(它必须使用rtmp2tdepay。我们将元数据封装在MPEG容器中):
gst-launch-1.0 udpsrc port=8888 caps=application/x-rtp\,\ media\=\(string\)video\,\ encoding-name\=\(string\)MP2T ! rtpmp2tdepay ! decodebin ! videoconvert ! autovideosink如果你用相机测试这个..。自动视频链接意味着新的窗口将弹出,显示你的相机。
然后你可以试着把它存储在文件里。我们将使用mp4mux..。因此,对于同样的相机输入,我们会:
gst-launch-1.0 -e udpsrc port=8888 caps=application/x-rtp\,\ media\=\(string\)video\,\ encoding-name\=\(string\)MP2T ! rtpmp2tdepay ! tsdemux ! h264parse ! mp4mux ! filesink location=test.mp4说明:我们不解码和重新编码(浪费处理能力),所以我只需要解码MPEG ts流,而不是解码H264,我将只为接受视频/x 264的mp4mux解析它。
现在,您可以使用相同的流水线为每个相机..。或者你可以把所有的元素都复制到同一条管道里。
现在,由于您没有提供任何--至少是部分--试图弄清楚一些东西,这将是您的家庭作业:)或者让自己更清楚地了解同步,因为我不理解它。
更新在您的更新后质疑这个答案并不是很有用,但是我会把它保存在这里作为参考。我不知道如何同步..。
另一个建议..。试着查看udpsrc之后的时间戳。也许他们已经同步了。在这种情况下,您可以使用流同步器同步两个流。或者可能是视频/音频混合器:
gst-launch-1.0 udpsrc -v port=8888 ! identity silent=false ! fakesink这应该打印时间戳(PTS、DTS、工期.):
/GstPipeline:pipeline0/GstIdentity:identity0: last-message = chain ******* (identity0:sink) (1328 bytes, dts: 0:00:02.707033598, pts:0:00:02.707033598, duration: none, offset: -1, offset_end: -1, flags: 00004000 tag-memory ) 0x7f57dc016400比较每条溪流的PTS。也许您可以将两个udpsrc组合在一个管道中,并在每个udpsrc输入标识(带有不同的name=something1)之后,使它们一起开始接收。
HTH
https://stackoverflow.com/questions/37555171
复制相似问题