我正在建立视频流传输管道。我想捕获实时视频流的缩略图。我使用jpegenc
将缓冲区编码为jpeg
并通过filesink
保存。我不想保存每个帧,我只想保存第10帧(即模10,这应该是可配置的)。我怎样才能做到这一点? (流来自rtsp源)
答案 0 :(得分:2)
以下解决方案在数学上可能不正确(例如以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图像添加管道运行时间戳,以便于跟踪。