如何使用Deepstream SDK读取视频并导出JPG格式帧(含代码需求)
实现读取视频输出JPG帧的代码示例
DeepStream Python 版本
该版本利用DeepStream的硬件加速编解码能力,适合同时需要执行AI推理+抽帧存图的场景:
import gi gi.require_version('Gst', '1.0') from gi.repository import Gst, GObject import pyds # 初始化GStreamer Gst.init(None) # 构建Pipeline,根据你的需求修改输入uri和输出路径 pipeline_desc = """ uridecodebin uri=file:///home/user/test_video.mp4 name=src src. ! nvv4l2decoder ! nvvidconv ! video/x-raw,format=I420 ! jpegenc quality=85 ! multifilesink location=/home/user/output/frame_%06d.jpg """ pipeline = Gst.parse_launch(pipeline_desc) # 启动pipeline pipeline.set_state(Gst.State.PLAYING) # 等待运行结束或错误 bus = pipeline.get_bus() msg = bus.timed_pop_filtered(Gst.CLOCK_TIME_NONE, Gst.MessageType.ERROR | Gst.MessageType.EOS) # 资源释放 pipeline.set_state(Gst.State.NULL)
如果需要在抽帧的同时执行目标检测等推理操作,只需要在nvv4l2decoder后插入nvstreammux + nvinfer组件即可
原生GStreamer Python 版本
无DeepStream依赖,适合仅需抽帧存图的轻量场景:
import gi gi.require_version('Gst', '1.0') from gi.repository import Gst Gst.init(None) # 可调整framerate参数控制抽帧频率,比如加videorate ! video/x-raw,framerate=1/1 表示每秒抽1帧 pipeline_desc = """ filesrc location=/home/user/test_video.mp4 ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! jpegenc quality=85 ! multifilesink location=/home/user/output/frame_%06d.jpg """ pipeline = Gst.parse_launch(pipeline_desc) pipeline.set_state(Gst.State.PLAYING) bus = pipeline.get_bus() msg = bus.timed_pop_filtered(Gst.CLOCK_TIME_NONE, Gst.MessageType.ERROR | Gst.MessageType.EOS) pipeline.set_state(Gst.State.NULL)
原生GStreamer CPP 版本
#include <gst/gst.h> int main(int argc, char *argv[]) { GstElement *pipeline; GstBus *bus; GstMessage *msg; gst_init(&argc, &argv); // 修改输入输出路径即可使用 const gchar *pipeline_desc = "filesrc location=/home/user/test_video.mp4 ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! jpegenc quality=85 ! multifilesink location=/home/user/output/frame_%06d.jpg"; pipeline = gst_parse_launch(pipeline_desc, NULL); gst_element_set_state(pipeline, GST_STATE_PLAYING); bus = gst_element_get_bus(pipeline); msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS)); if (msg != NULL) gst_message_unref(msg); gst_object_unref(bus); gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); return 0; }
运行注意事项
- DeepStream版本需要提前安装对应版本的DeepStream SDK和NVIDIA驱动,确保硬件加速编解码组件可用
- 原生GStreamer版本需要提前安装基础插件包:
gstreamer1.0-plugins-base、gstreamer1.0-plugins-good、gstreamer1.0-plugins-bad - 若需要控制抽帧频率,可在pipeline中插入
videorate组件,例如加入videorate ! video/x-raw,framerate=1/1表示每秒仅抽取1帧 - 输出路径需要提前创建,否则会出现写入失败的问题
内容的提问来源于stack exchange,提问作者devl
相关产品推荐
相关产品推荐

