如何在Python3中用gi.repository实现可运行的GStreamer管道?
GStreamer Python手动创建管道生成无法播放的MP4文件问题
我首次在此提问,目前正在Python3中用gi.repository手动搭建GStreamer管道,而非使用deepstream-app或gst-launch-1.0工具——后续要集成NVIDIA模块做流视频目标检测,手动创建管道更方便提取DNN推理元数据。
我有一个可用的管道命令:v4l2src device=/dev/video0 ! video/x-raw ! videoconvert ! x264enc ! h264parse config-interval=3 ! qtmux ! filesink location=video.mp4
不管用gst-launch-1.0执行,还是用gi.repository里的Gst.parse_launch("pipeline")调用,都能正常从USB摄像头生成可播放的MP4文件。
但当我手动逐个创建元素并链接时,生成的MP4文件大小约1MB却无法播放:Windows10视频应用报错0xc00d36c4,VLC也打不开。我怀疑问题出在muxer元素(qtmux或mp4mux)上,之前看到过示例里需要手动链接muxer的sink pad和前一个元素的source pad,这涉及动态Pad,但我不清楚什么时候该用动态Pad。
以下是我的代码片段:
导入部分
import sys import gi gi.require_version('Gst', '1.0') from gi.repository import GLib, Gst import time import pyds
管道及元素创建部分
Gst.init(None) player=Gst.Pipeline.new("player") print("Pipeline created") v4l2Source=Gst.ElementFactory.make("v4l2src","v4l2Source") v4l2Source.set_property("device", "/dev/video0") print("USB cam source created") caps = Gst.Caps.from_string("video/x-raw") filter= Gst.ElementFactory.make("capsfilter", "filter") filter.set_property("caps", caps) videoconvert = Gst.ElementFactory.make("videoconvert", "converter") encoder = Gst.ElementFactory.make("x264enc","venc") parser=Gst.ElementFactory.make("h264parse","parser") parser.set_property("config-interval", 3) muxer=Gst.ElementFactory.make("mp4mux","muxer") filesink=Gst.ElementFactory.make("filesink","sinker") filesink.set_property("location","pvideo.mp4") print("All elements created") i=0 for ele in [v4l2Source,filter,videoconvert,encoder,parser,muxer,filesink]: print(f"Element {i} added to the pipeline") player.add(ele) i+=1 print("All Elements added to the pipeline")
元素链接部分(疑似问题所在)
v4l2Source.link(filter) filter.link(videoconvert) videoconvert.link(encoder) encoder.link(parser) ''' sinkpad = muxer.get_request_pad("video_0") if not sinkpad: sys.stderr.write(" Unable to get the sink pad of streammux \n") srcpad = parser.get_static_pad("src") if not srcpad: sys.stderr.write(" Unable to get source pad of caps_vidconvsrc \n") srcpad.link(sinkpad) ''' parser.link(muxer) muxer.link(filesink) print("All elements linked")
执行与停止部分
player.set_state(Gst.State.PLAYING) print("Recording") time.sleep(20) print('Sending EOS') player.send_event(Gst.Event.new_eos()) print('Waiting for EOS')
内容的提问来源于stack exchange,提问作者mo_oises
相关产品推荐
相关产品推荐

