【问题标题】:How to make Gstreamer return only keyframes?如何让 Gstreamer 只返回关键帧?
【发布时间】:2018-12-20 19:44:40
【问题描述】:

gstreamer 管道中,我试图弄清楚是否有办法指定我只想要来自RTSP 流的关键帧

ffmpeg 中,您可以使用-skip_frame nokey 标志来执行此操作。例如:

ffmpeg -skip_frame nokey -i rtsp://184.72.239.149/vod/mp4:BigBuckBunny_175k.mov -qscale 0 -r 1/1 frame%03d.jpg

读取 RTSP 提要的相应 gstreamer 命令如下所示:

gst-launch-1.0 rtspsrc location=rtsp://184.72.239.149/vod/mp4:BigBuckBunny_175k.mov ! decodebin ! videorate ! "video/x-raw,framerate=1/1" ! videoconvert ! autovideosink

有谁知道是否可以要求 gstreamer 只返回关键帧?

【问题讨论】:

    标签: ffmpeg gstreamer rtsp rtsp-client


    【解决方案1】:

    在花了几天时间寻找这个问题的完整答案后,我最终找到了一个解决方案,该解决方案为我提供了我正在寻找的 rtsp 处理提升。

    这是 Python 中从处理每个 RTSP 帧转变为仅处理关键帧的管道的差异。

    https://github.com/ambianic/ambianic-edge/pull/171/files#diff-f89415777c559bba294250e788230c5e

    首先注册流启动总线事件:

    Gst.MessageType.STREAM_START
    

    当流处理开始时触发。当此事件发生时,请求寻找下一个关键帧。

    请求完成后,管道触发下一个我们需要监听的总线事件:

    Gst.MessageType.ASYNC_DONE
    

    最后,这是关键帧搜索请求本身:

        def _gst_seek_next_keyframe(self):
            found, pos_int = self.gst_pipeline.query_position(Gst.Format.TIME)
            if not found:
                log.warning('Gst current pipeline position not found.')
                return
            rate = 1.0  # keep rate close to real time
            flags = \
                Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT | \
                Gst.SeekFlags.TRICKMODE | Gst.SeekFlags.SNAP_AFTER | \
                Gst.SeekFlags.TRICKMODE_KEY_UNITS | \
                Gst.SeekFlags.TRICKMODE_NO_AUDIO
            is_event_handled = self.gst_pipeline.seek(
                rate,
                Gst.Format.TIME,
                flags,
                Gst.SeekType.SET, pos_int,
                Gst.SeekType.END, 0)
    

    【讨论】:

      【解决方案2】:

      您可以使用带有标志GstSeekFlags 的新搜索事件gst_event_new_seek 用于技巧模式GST_SEEK_FLAG_TRICKMODE,跳过帧GST_SEEK_FLAG_SKIP 和仅关键帧GST_SEEK_FLAG_TRICKMODE_KEY_UNITS

      您还可以使用identity 及其属性drop-buffer-flags 来过滤GST_BUFFER_FLAG_DELTA_UNITGST_BUFFER_FLAG_DROPPABLE

      请参阅文档中的 trickmodesseekingGstSeekFlags 以了解身份,identity:drop-buffer-flagsGstBufferFlags 了解身份。

      【讨论】:

        【解决方案3】:

        我认为您可以尝试在设置了GST_BUFFER_FLAG_DELTA_UNIT 标志的缓冲区上添加GST_PAD_PROBE_TYPE_BUFFER 填充探针并返回GST_PAD_PROBE_DROP

        【讨论】:

        • 谢谢,您知道如何将其添加到 gst-launch 管道吗?
        • 不幸的是,我认为只有在代码中才有可能。 gst-launch 旨在只是某种快速测试工具,而不是像 ffmpeg 那样功能齐全的应用程序。
        猜你喜欢
        • 2012-10-08
        • 2017-07-09
        • 2019-04-08
        • 1970-01-01
        • 1970-01-01
        • 2023-02-10
        • 2021-04-23
        • 2021-03-27
        • 1970-01-01
        相关资源
        最近更新 更多