为什么从 gstreamer 检索到的 PTS 与保存的 ts 不匹配

问题描述 投票:0回答:1

我有一个管道,可以从相机中提取 rtsp 流并在其上运行一些 AI 检测。 我已经在 Rust 中实现了它,但我的简化管道如下所示

rtspsrc -> rtspsrc  latency=100 location=rtsp://<rtspurl>  protocols=0x4 name=basesrc basesrc. ! rtph264depay ! tee name=t \
t. ! queue ! vaapidecodebin name=video_decoder ! tee name=decode_t \
   decode_t. ! queue ! videorate ! video/x-raw,framerate=15/1 ! vaapipostproc format=nv12 ! video/x-raw,width=2880,height=1620 ! vaapih265enc ! h265parse config-interval=-1 ! hlssink2 playlist-length=5 max-files=0 target-duration=10 send-keyframe-requests=true program-date-time=true playlist-location=manifest.m3u8 location=video/%t.ts \
   decode_t. ! queue ! videorate ! video/x-raw,framerate=3/1 ! vaapipostproc format=nv12 ! video/x-raw,width=640,height=384 ! videoconvert ! objectdetector ! fakesink async=false 

objectDetector 是我的自定义插件,当检测到对象时,它会向总线发送消息。我通过获取类型

的帧来捕获其transform_frame_ip()实现中的PTS
frame: &mut gst_video::VideoFrameRef<&mut gst::BufferRef>

我得到了如下的分数

let pts = frame.buffer().pts().expect("Buffer must have a PTS value.");

但是,当我尝试打印hlssink元素收集的TS段的所有帧PTS时,PTS时间完全不同。

我使用以下命令来获取 ts 段的 PTS。

ffprobe -select_streams v -show_frames -of csv -show_entries frame=coded_picture_number,key_frame,pict_type,pts,pts_time -i <>

我正在使用这些 PTS 值来尝试将其与实际播放时间相匹配,以便我可以在播放清单时在 Web 浏览器中绘制边界框。

我做错了什么?我很感激任何帮助。

rust gstreamer gstreamer-rs
1个回答
0
投票

造成这种情况的可能原因有多种:

  • GStreamer PTS 以 GStreamer 时钟来表示,它是在管道启动时在元素之间协商的。当读取文件或接收网络流时,相应的源元素将传入的 PTS 转换为与协商时钟相关的值。这样,如果您的管道中有多个源,即使传入流不相关,它们也会获得一致的 PTS。

    如果您设置了

    add-reference-timestamp-meta
    ,RTSP 源似乎可以将带有原始 PTS 的元数据添加到所有缓冲区,因此这可能允许您以某种方式检索您期望的 PTS。然而,

  • RTP 也有自己的时间戳机制,独立于 TS 中嵌入的 PTS,并且看起来 GStreamer 使用这些机制而不是 TS 时间戳(请参阅

    buffer-mode
    属性的文档)。不过,您可以使用嵌入在 emit-stats
     元素中的 
    tsdemux
    元素中的
    decode
     属性从 TS 中检索原始 PTS。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.