1.導入gstream
導入gstream
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject, GLib
Gst.init(None)
2.連接的回調函數
隨機襯墊的回調函數
def on_pad_added( src, pad, des):
vpad = des.get_static_pad("sink") # 獲取後續元件的接收襯墊
pad.link(vpad) # 源元件的新產生的隨機襯墊和後續元件襯墊連接
`查看襯墊屬性
gst-inspect-1.0 | grep 襯墊名 rtspsrc
gst-inspect-1.0 襯墊名 查看襯墊的具體信息
Pad Templates: 襯墊模板
SRC template: ‘subtitle_%u’ 源襯墊
Availability: Sometimes 類型 隨機襯墊 用回調函數連接元件
Capabilities:
ANY
SINK template: ‘sink’ 接收襯墊
Availability: Always 類型 永久襯墊 pipe.link()直接連接
Capabilities:
video/quicktime
video/mj2
audio/x-m4a
application/x-3gp
注意:除了永久襯墊,隨機襯墊 還有 request襯墊(請求襯墊),連接時也需要使用回調函數
def cb_decodebin_newpad(src, pad, dst):
caps = Gst.Pad.get_current_caps(pad)
structure_name = caps.to_string()
if structure_name.startswith("video"):
videorate_pad = dst.get_static_pad("sink")
pad.link(videorate_pad)
def cb_audiodecode_newpad(src, pad, dst):
caps = Gst.Pad.get_current_caps(pad)
structure_name = caps.to_string()
if structure_name.startswith("audio"):
volume_pad = dst.get_static_pad("sink")
pad.link(volume_pad)
3.創建管道和元件
# 管道
pipe = Gst.Pipeline.new('test')
# 源元件
srcv = Gst.ElementFactory.make('rtspsrc', 'srcv')
srca = Gst.ElementFactory.make('rtspsrc', 'srca')
# 解封裝元件
depayv = Gst.ElementFactory.make('rtph264depay', 'depayv')
depaya = Gst.ElementFactory.make('rtppcmadepay', 'depaya')
# 緩存元件
queuev = Gst.ElementFactory.make('queue2', 'queuev')
queuea = Gst.ElementFactory.make('queue2', 'queuea')
# src的屬性是rtspsrc 的SRC是sometime 使用回調函數
srcv.connect('pad-added', on_pad_added, queuev)
srca.connect('pad-added', on_pad_added, queuea)
# 轉換元件 可以設置屬性
conv = Gst.ElementFactory.make("videoconvert", "conv")
cona = Gst.ElementFactory.make("audioconvert", "cona")
# 接受元件
sinkv = Gst.ElementFactory.make("xvimagesink", "sinkv")
sinka = Gst.ElementFactory.make("autoaudiosink", "sinka")
# 解解碼元件
decodebinv = Gst.ElementFactory.make("avdec_h264", "decodev")
decodebina = Gst.ElementFactory.make("decodebin", "decodea")
decodebina.connect("pad-added", cb_audiodecode_newpad, cona)
# rtsp視頻接入的相機
rstp = 'rtsp://admin:xxxxxx@xxxxxx/Streaming/channels/802'
srcv.set_property("location", rstp)
srca.set_property("location", rstp)
4 元件連接
1 將元件添加到管道
elementsv = [queuev, depayv, decodebinv, conv, sinkv]
elementsa = [queuea, depaya, decodebina, cona, sinka]
pipe.add(srcv)
pipe.add(srca)
for element in elementsv:
pipe.add(element)
for element in elementsa:
pipe.add(element)
2.元件在管道里面連接
for i in range(len(elementsv) - 1):
elementsv[i].link(elementsv[i + 1])
for i in range(len(elementsa) - 1):
elementsa[i].link(elementsa[i + 1])
5 設置管道的狀態
pipe.set_state(Gst.State.PLAYING)
mainloop = GLib.MainLoop()
mainloop.run()
6 補充1
vmuxpad = muxer.get_request_pad("video_%u") # 獲得視頻流的請求襯墊
vsrcpad = vfilter.get_static_pad("src") # 獲得過濾元件的src襯墊
vsrcpad.link(vmuxpad) # 過濾元件(vmuxpad)和封裝元件(vsrcpad)鏈接
matroskamux sink 類型 request
src 類型 Always