我正在建立视频流传输管道。我想捕获实时视频流的缩略图。我已经使用jpegenc
将缓冲区编码为jpeg
,并通过filesink
保存它。我不想保存每个帧,我只想保存第10帧(即模10,这应该是可配置的)。我怎样才能做到这一点? (该流来自rtsp源)
以下解决方案在数学上可能不正确(例如,以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
“输出”上限以达到所需的“输出”帧率。
[Note我添加了timeoverlay halignment=right valignment=bottom
,它将为视频/ jpg图像添加管道运行时间戳,以便于跟踪。