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

Ash*_*sad 5 python gstreamer python-gstreamer raspberry-pi gstreamer-1.0

我正在尝试实现的管道架构

当两个队列在将管道设置为 之前链接在一起时,该脚本运行良好PLAYING,但我很难理解 Gstreamer 动态管道及其实现。此外,缺乏 gstreamer 1.0 python 的文档/示例也没有帮助。

这是使用 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)
Run Code Online (Sandbox Code Playgroud)

我正在尝试做的事情:

  • 最初只有一个队列(queueFile)开始记录到文件(始终运行)
  • 按需动态添加和删除队列到发球台 ( queueCloud ),并流式传输到服务器

gstreamer 1.0 和 gi python 的文档并不多,非常感谢任何帮助。

小智 0

您可以在和dynamic之间添加一个identity , 元素,而不是动态删除第二个队列。如果这样做,您可以将其属性修改为 0(以便所有缓冲区都通过)和 1(以便不允许任何缓冲区)之间的属性。teequeuedrop-probability

只要服务器流分支始终存在,这应该会重现您想要的行为。