You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:05:26