首页 > 解决方案 > 从 RTSP 捕获 jpeg 图像 - gStreamer

问题描述

我正在构建一个视频流管道。我想捕获实时视频流的缩略图。我曾经jpegenc将缓冲区编码jpeg并通过filesink. 我不想保存每一帧,我只想保存第 10 帧(即模 10,这应该是可配置的)。我怎样才能做到这一点?(流来自 rtsp 源)

标签: video-streamingjpeggstreamerrtsp

解决方案


以下解决方案在数学上可能不正确(例如,以 100% 的准确率捕获每 10 帧)但也许值得一提。它基于 gstreamer 的videorate元素,可以操纵视频 FPS(每秒帧数)。

假设我们有类似这样的rtsp 源:

rtsp://freja.hiof.no:1935/rtplive/_definst_/hessdalen03.stream

(公共摄像头,H264 视频,帧率=60000/1001=~60 帧/秒)。

管道

gst-launch-1.0 -v rtspsrc location="rtsp://freja.hiof.no:1935/rtplive/_definst_/hessdalen03.stream" \
! rtph264depay ! avdec_h264 \
! timeoverlay halignment=right valignment=bottom \
! videorate ! video/x-raw,framerate=60000/1001 ! jpegenc ! multifilesink location="./frame%08d.jpg"

应该捕获每个接收到的视频帧并将其保存为 jpg 图像。

但是如果你viderate像这样修改大写

video/x-raw,framerate=6000/1001

捕获帧的速率约为 6 fps(少 10 倍,理论上应该每 6 帧捕获一次)。

因此,知道输入视频的帧率,您可以修改viderate“输出”上限以实现所需的“输出”帧率。

请注意,我添加timeoverlay halignment=right valignment=bottom了它将为视频/jpg图像添加管道运行时间戳以便于跟踪。


推荐阅读