如何让Gstreamer只返回关键帧?

Ant*_*rov 4 ffmpeg rtsp gstreamer rtsp-client

gstreamer管道中,我试图弄清楚是否有一种方法可以指定我只需要来自 RTSP 流的关键帧

您可以使用flagffmpeg来做到这一点-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 仅返回关键帧?

小智 5

在花了几天时间寻找这个问题的完整答案后,我最终找到了一个解决方案,它给了我我正在寻找的 rtsp 处理能力。

以下是 Python 中管道的差异,从处理每个 RTSP 帧过渡到仅处理关键帧。

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

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

Gst.MessageType.STREAM_START
Run Code Online (Sandbox Code Playgroud)

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

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

Gst.MessageType.ASYNC_DONE
Run Code Online (Sandbox Code Playgroud)

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

Gst.MessageType.STREAM_START
Run Code Online (Sandbox Code Playgroud)