video-streaming - 从 RTSP 捕获 jpeg 图像 - gStreamer
问题描述
我正在构建一个视频流管道。我想捕获实时视频流的缩略图。我曾经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
“输出”上限以实现所需的“输出”帧率。
请注意,我添加timeoverlay halignment=right valignment=bottom
了它将为视频/jpg图像添加管道运行时间戳以便于跟踪。
推荐阅读
- node.js - 如何使用猫鼬替换 JSON 数组中的字符串
- math - 逻辑的一般数学谜语
- r - R数据框到嵌套列表
- spring-boot - 每次重新启动应用程序时,@RepositoryRestResource 都会更改 url
- c++ - 当其中的参数未声明为 const 时的构造函数错误
- html - HTML CSS 边框在 Safari 浏览器中无法正常工作
- asp.net - 如何从 Asp.net 中的代码 (.aspx.cs) 中更改超链接单击时的页面标题
- php - symfony 序列化看不到 PHP 公共 getter/setter
- c# - 获取角色中的用户列表:ASPNEt MVC
- javascript - 如何使用反应钩子在功能组件中打开和关闭模式