如果你将录制内容保存到不同的视频文件中,那么你不需要任何同步。因为这会完全将它们分开。每个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
如果您使用相机进行测试,则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,然后将其解析为接受video/x-h264的mp4mux。
现在您可以为每个摄像机使用相同的管道...或者只需将所有元素复制粘贴到同一管道中...
现在,由于您没有提供任何 - 至少部分的 - 尝试去理解这个问题,这将成为您的家庭作业 :) 或者让自己更清楚地了解同步,因为我不理解它...
更新
根据您对问题的更新,此答案并不是很有用,但我将保留它作为参考。我不知道如何进行同步...
另一个建议..尝试查看udpsrc之后的时间戳..也许它们已经同步了..在这种情况下,您可以使用streamsynchronizer来同步两个流..或者可能是视频/音频混合器:
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之后放置identity(使用不同的name=something1
),使它们同时开始接收。
希望对您有所帮助。