ffmpeg - 如何让Gstreamer只返回关键帧?

标签 ffmpeg gstreamer rtsp rtsp-client

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 帧%03d.jpg

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

gst-launch-1.0 rtspsrc location=rtsp://184.72.239.149/vod/mp4:BigBuckBunny_175k.mov !解码器!视频率! “视频/x-raw,帧速率=1/1”!视频转换!自动视频接收器

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

最佳答案

花了几天时间寻找这个问题的完整答案后,我最终找到了一个解决方案,它为我提供了我正在寻找的 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)

关于ffmpeg - 如何让Gstreamer只返回关键帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51307975/

相关文章:

c - gstreamer opencv 接收和编辑流

Gstreamer、rtspsrc 和负载类型

html - 将 RTSP 流转换为 MP4

python - 为什么我得到 "method DESCRIBE failed: 401 Unauthorized "

FFMPEG 参数 'pixel_aspect' 超出范围

ffmpeg可以解码G711音频吗

ffmpeg - 使用 ffmpeg 实时流式传输 MPEG-TS 和 windows 媒体服务

java - ffmpeg只录制6秒的视频

opencv - 使用OpenCV从Gstreamer接收

linux - GStreamer - v4l2 不适用于 gstreamer 0.1