首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用H264同步两个RTSP/RTP H264视频流捕获

利用H264同步两个RTSP/RTP H264视频流捕获
EN

Stack Overflow用户
提问于 2016-05-31 20:36:15
回答 2查看 7K关注 0票数 4

我有两个轴的IP相机流H264流通过RTSP/RTP。两个摄像机都被设置为与相同的NTP服务器同步,因此我假设两个摄像机都有相同的精确时钟(在ms中可能略有差异)。

在我的应用程序中,两个摄像机都指向相同的视图,它需要处理同一时间的两个摄像机图像。因此,我希望使用GStreamer同步图像捕获。

我尝试在不同的cmd提示下分别调用两个管道,但视频间隔为2-3秒。

  1. gst-发射rtspsrc位置=rtsp://192.168.16.136:554/live!rtph264depay!h264parse!Splitmux接收器最大大小-时间=100000000 location=cam1_video_%d.mp4
  2. gst-发射rtspsrc位置=rtsp://192.168.16.186:554/live!rtph264depay!h264parse!Splitmux接收器最大大小-时间=100000000 location=cam2_video_%d.mp4

有人能建议一个gstreamer管道来同步两个H264流并将它们记录到单独的视频文件中吗?

谢谢!手臂

EN

回答 2

Stack Overflow用户

发布于 2016-06-03 17:47:49

我能够使用gst启动管道,如下所示。与两条流水线相比,该算法在捕获帧同步方面有了很好的改进。大多数情况下,它们相差0到500毫秒。尽管如此,我仍然希望它们的同步小于150毫秒的精度。

代码语言:javascript
复制
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

感谢有人能指出其他的想法!

~臂

票数 2
EN

Stack Overflow用户

发布于 2016-06-01 06:33:00

同步是什么意思?如果记录到单独的视频文件,则不需要任何同步。因为这会把他们完全分开..。每个RT(S)P流将包含不同的时间戳,如果您想将它们以某种方式对齐到同一时间(我指的是真实的人类时间)。就像“两者都应该从15:00开始”),那么你必须以某种方式配置它们(这只是一个想法)。

你也没有告诉我们那些rtp/rtsp流里面的是什么(是MPEG、ts还是纯IP)。等)。因此,我将给出mpeg ts封装的rtp流的例子。我们将一步一步地走:

假设这是一台相机,只是为了展示它的外观:

代码语言:javascript
复制
gst-launch-1.0 -v videotestsrc ! videoconvert ! x264enc ! mpegtsmux ! rtpmp2tpay ! udpsink host=127.0.0.1 port=8888

然后,这将是累赘(它必须使用rtmp2tdepay。我们将元数据封装在MPEG容器中):

代码语言:javascript
复制
gst-launch-1.0 udpsrc port=8888 caps=application/x-rtp\,\ media\=\(string\)video\,\ encoding-name\=\(string\)MP2T ! rtpmp2tdepay ! decodebin ! videoconvert ! autovideosink

如果你用相机测试这个..。自动视频链接意味着新的窗口将弹出,显示你的相机。

然后你可以试着把它存储在文件里。我们将使用mp4mux..。因此,对于同样的相机输入,我们会:

代码语言:javascript
复制
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之后的时间戳。也许他们已经同步了。在这种情况下,您可以使用流同步器同步两个流。或者可能是视频/音频混合器:

代码语言:javascript
复制
gst-launch-1.0 udpsrc -v port=8888 ! identity silent=false ! fakesink

这应该打印时间戳(PTS、DTS、工期.):

代码语言:javascript
复制
/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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37555171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档