如何使用系统时钟从 gstreamer 获取时间戳?

KPM*_*KPM 5 command-line synchronization gstreamer

我目前设置了两个命令行管道,用于通过以太网将视频从 Raspberry Pi 相机(ArduCam 模块)传输到 PC;这些工作得很好:

gst-sender.sh

./video2stdout | gst-launch-1.0 -v fdsrc fd=0 ! \
video/x-h264, width=1280, height=800, framerate=60/1 ! \
h264parse ! rtph264pay ! \
udpsink host=xxx.xxx.xx.xxx port=xxxx
Run Code Online (Sandbox Code Playgroud)

gst-receiver.sh

gst-launch-1.0 -v -e udpsrc port=xxxx \
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, \
encoding-name=(string)H264, payload=(int)96" ! \
rtph264depay ! h264parse ! mp4mux ! filesink location=video.mp4
Run Code Online (Sandbox Code Playgroud)

但是,我最终将运行多个摄像机,通过外部硬件触发器同步,并且由于我无法保证流将同时开始,因此我需要时间戳 - 无论是流开始时间还是每一帧。

通过在 gst-sender.sh 中的 h264parse 和 rtph264pay 之间添加“identity silent=false”,我可以访问流的缓冲区数据,并使用以下命令检索帧时间戳:

./gst-sender.sh | grep -oP "(?<=dts: )(\d+:){2}\d+.\d+"
Run Code Online (Sandbox Code Playgroud)

但是这些时间戳是相对于流的开始的,所以我不能用它们来排列多个流中保存的视频!

Start video encoding...
0:00:00.000000000
0:00:00.016666666
0:00:00.033333332
0:00:00.049999998
0:00:00.066666664
0:00:00.083333330
0:00:00.099999996
0:00:00.116666662
0:00:00.133333328
0:00:00.149999994
0:00:00.166666660
0:00:00.183333326
Run Code Online (Sandbox Code Playgroud)

看起来 gstreamer 有一个用于延迟计算的“绝对”时钟时间[1],但我一直无法找到任何从命令行访问它的方法。

有没有办法从命令行访问 gstreamer 的绝对/系统时钟?或者另一种获取流开始时间戳的方法?