gstreamer 1.0+;python:从播放管道动态链接和取消链接队列

gstreamer 1.0+;python:从播放管道动态链接和取消链接队列,python,raspberry-pi,gstreamer,python-gstreamer,gstreamer-1.0,Python,Raspberry Pi,Gstreamer,Python Gstreamer,Gstreamer 1.0,在将管道设置为播放之前,当两个队列链接在一起时,脚本运行良好,但我很难理解Gstreamer动态管道及其实现。此外,缺乏gstreamer1.0python的文档/示例也于事无补 这是一个工作脚本,它使用tee记录到一个文件中,并流式传输到一个RTMP服务器 import gi import time from gi.repository import GObject, Gst gi.require_version('Gst', '1.0') Gst.init(None) Gst.debug

在将管道设置为
播放
之前,当两个队列链接在一起时,脚本运行良好,但我很难理解Gstreamer动态管道及其实现。此外,缺乏gstreamer1.0python的文档/示例也于事无补

这是一个工作脚本,它使用tee记录到一个文件中,并流式传输到一个RTMP服务器

import gi
import time
from gi.repository import GObject, Gst
gi.require_version('Gst', '1.0')

Gst.init(None)

Gst.debug_set_active(True)
Gst.debug_set_default_threshold(3)
pipeline = Gst.Pipeline()

rpicamsrc = Gst.ElementFactory.make("rpicamsrc", "rpicam")
rpicamsrc.set_property("bitrate", 500000)
rpicaps = Gst.caps_from_string('video/x-h264,width=360,height=240,framerate=10/1')
rCamCapsFilt = Gst.ElementFactory.make("capsfilter", "rCamCapsFilt")
rCamCapsFilt.set_property("caps", rpicaps)

h264parse = Gst.ElementFactory.make("h264parse", "h264")
h264parse2 = Gst.ElementFactory.make("h264parse", "enh2642")

flvmux = Gst.ElementFactory.make("flvmux", "flv")
mp4mux = Gst.ElementFactory.make("mp4mux", "mp4")

filesink = Gst.ElementFactory.make("filesink", "fsink")
filesink.set_property("location", "specific2.mp4")

rtmpsink = Gst.ElementFactory.make("rtmpsink", "rsink")
rtmpsink.set_property("location", "rtmp://<server>/live/test")

tee = Gst.ElementFactory.make("tee", "tee")

queueCloud = Gst.ElementFactory.make("queue", "cloud")
queueFile = Gst.ElementFactory.make("queue", "file")

pipeline.add(tee)
pipeline.add(queueCloud)
pipeline.add(queueFile)
pipeline.add(filesink)
pipeline.add(rtmpsink)

pipeline.add(rpicamsrc)
pipeline.add(rCamCapsFilt)
pipeline.add(h264parse)
pipeline.add(h264parse2)
pipeline.add(flvmux)
pipeline.add(mp4mux)

rpicamsrc.link(rCamCapsFilt)
rCamCapsFilt.link(tee)

queueCloud.link(h264parse)
h264parse.link(flvmux)
flvmux.link(rtmpsink)

queueFile.link(h264parse2)
h264parse2.link(mp4mux)
mp4mux.link(filesink)

tee.link(queueCloud)
tee.link(queueFile)


pipeline.set_state(Gst.State.PLAYING)
time.sleep(5)
#
# pipeline.set_state(Gst.State.NULL)
导入gi
导入时间
从gi.repository导入GObject,Gst
gi.require_版本('Gst','1.0')
Gst.init(无)
Gst.debug\u set\u active(真)
Gst.debug\u set\u default\u阈值(3)
管道=Gst.pipeline()
rpicamsrc=Gst.ElementFactory.make(“rpicamsrc”、“rpicam”)
rpicamsrc.set_属性(“比特率”,500000)
rpicaps=Gst.caps\u from\u字符串('video/x-h264,宽度=360,高度=240,帧速率=10/1')
rCamCapsFilt=Gst.ElementFactory.make(“capsfilter”、“rCamCapsFilt”)
rCamCapsFilt.set_属性(“caps”,rpicaps)
h264parse=Gst.ElementFactory.make(“h264parse”、“h264”)
h264parse2=Gst.ElementFactory.make(“h264parse”、“enh2642”)
flvmux=Gst.ElementFactory.make(“flvmux”、“flv”)
mp4mux=Gst.ElementFactory.make(“mp4mux”、“mp4”)
filesink=Gst.ElementFactory.make(“filesink”、“fsink”)
filesink.set_属性(“位置”、“specific2.mp4”)
rtmpsink=Gst.ElementFactory.make(“rtmpsink”、“rsink”)
rtmpsink.set_属性(“位置”rtmp:///live/test")
三通=Gst.ElementFactory.make(“三通”、“三通”)
queueCloud=Gst.ElementFactory.make(“队列”、“云”)
queueFile=Gst.ElementFactory.make(“队列”、“文件”)
管道。添加(T形三通)
pipeline.add(queueCloud)
添加(队列文件)
添加(文件链接)
pipeline.add(rtmpsink)
管道添加(rpicamsrc)
管道添加(rCamCapsFilt)
pipeline.add(h264parse)
管道添加(H2642)
管道添加(flvmux)
管道添加(mp4mux)
rpicamsrc.link(rCamCapsFilt)
rCamCapsFilt.link(三通)
queueCloud.link(h264parse)
h264parse.link(flvmux)
flvmux.link(rtmpsink)
queueFile.link(H2642)
H2642.link(mp4mux)
链接(文件链接)
tee.link(队列云)
tee.link(队列文件)
管道。设置_状态(Gst.state.PLAYING)
时间。睡眠(5)
#
#pipeline.set_state(Gst.state.NULL)
我想做什么:

  • 最初只从一个队列开始(queueFile),该队列记录到一个文件(始终运行)
  • 按需动态添加和删除队列到传输到服务器的tee(queueCloud)
对于gstreamer1.0和gipython没有太多文档,非常感谢您的帮助