gstream初次嘗試

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章