簡體   English   中英

是否有將 gstreamer 管道轉換為 python 代碼的指南?

[英]Is there a guide for converting a gstreamer pipeline to python code?

我正在嘗試使用 python 通過終端命令( gst-launch-1.0 filesrc location=sample.264 ! h264parse ! decodebin ! videoconvert ! autovideosink )實現一個簡單的gstreamer管道。 這是我的完整代碼:

import sys
import platform
import configparser

import gi

gi.require_version('Gst', '1.0')

from gi.repository import GObject, Gst, GLib

def bus_call(bus, message, loop):
    t = message.type
    if t == Gst.MessageType.EOS:
        sys.stdout.write("End-of-stream\n")
        loop.quit()
    elif t==Gst.MessageType.WARNING:
        err, debug = message.parse_warning()
        sys.stderr.write("Warning: %s: %s\n" % (err, debug))
    elif t == Gst.MessageType.ERROR:
        err, debug = message.parse_error()
        sys.stderr.write("Error: %s: %s\n" % (err, debug))
        loop.quit()
    return True

def main(args):
    if len(args) != 2:
        sys.stderr.write("usage: %s <media file or uri>\n" % args[0])
        sys.exit(1)
        
    GObject.threads_init()
    Gst.init(None)
    
    print("Creating Pipeline \n ")
    pipeline = Gst.Pipeline()
    
    if not pipeline:
        sys.stderr.write(" Unable to create Pipeline \n")
        
    print("Creating Source \n ")
    source = Gst.ElementFactory.make("filesrc", "file-source")
    if not source:
        sys.stderr.write(" Unable to create Source \n")
    
    print("Creating H264Parser \n")
    h264parser = Gst.ElementFactory.make("h264parse", "h264-parser")
    if not h264parser:
        sys.stderr.write(" Unable to create h264 parser \n")
        
    print("Creating Decoder \n ")
    decoder = Gst.ElementFactory.make("decodebin", "decode")
    if not decoder:
        sys.stderr.write(" Unable to create Decode \n")
        
    print("Creating Video Converter \n ")
    converter = Gst.ElementFactory.make("videoconvert", "converter")
    if not source:
        sys.stderr.write(" Unable to create Video Converter \n")
        
    print("Creating Sink \n ")
    sink = Gst.ElementFactory.make("autovideosink", "video-sink")
    if not source:
        sys.stderr.write(" Unable to create Sink \n")
        
    print("Playing file %s " %args[1])
    source.set_property('location', args[1])
    
    print("Adding elements to Pipeline \n")
    pipeline.add(source)
    pipeline.add(h264parser)
    pipeline.add(decoder)
    pipeline.add(converter)
    pipeline.add(sink)
    
    print("Linking elements in the Pipeline \n")
    source.link(h264parser)
    h264parser.link(decoder)
    decoder.link(converter)
    converter.link(sink)
    
    loop = GLib.MainLoop()
    
    bus = pipeline.get_bus()
    bus.add_signal_watch()
    bus.connect ("message", bus_call, loop)
    
    print("Starting pipeline \n")
    
    pipeline.set_state(Gst.State.PLAYING)
    try:
        loop.run()
    except:
        pass
        
    pipeline.set_state(Gst.State.NULL)
    
if __name__ == '__main__':
    sys.exit(main(sys.argv))

當我運行此腳本時,終端在啟動管道后顯示錯誤:

Error: gst-stream-error-quark: Internal data stream error. (1): gstbaseparse.c(3634): gst_base_parse_loop (): /GstPipeline:pipeline0/GstH264Parse:h264-parser:
streaming stopped, reason not-linked (-1)

這是完整的終端輸出:

sudo python3 pipe.py sample.264

Creating Pipeline 
 
Creating Source 
 
Creating H264Parser 

Creating Decoder 
 
Creating Video Converter 
 
Creating Sink 
 
Playing file sample.264 
Adding elements to Pipeline 

Linking elements in the Pipeline 

Starting pipeline 

Error: gst-stream-error-quark: Internal data stream error. (1): gstbaseparse.c(3634): gst_base_parse_loop (): /GstPipeline:pipeline0/GstH264Parse:h264-parser:
streaming stopped, reason not-linked (-1)

有沒有辦法解決這個問題?

使用gst_parse_launch()等便利功能時,您可以讓您的生活更輕松。 這將根據您提供給gst-launch-1.0的相同語法構建管道。

在 python 和你的例子中,有一些東西:

pipeline = Gst.parse_launch("filesrc location=sample.264 ! h264parse ! decodebin ! videoconvert ! autovideosink")

您可以在該管道上設置總線回調,並將其設置為 PLAYING 等,就像您在示例中所做的那樣。

對原始代碼的一些解釋:您使用了decodebin元素。 一旦管道運行,那個只會暴露焊盤。 所以你不能在此之前將它鏈接到任何東西。 這是必須通過掛鈎到它的回調來手動完成的事情。

要進一步閱讀動態管道示例:

https://gstreamer.freedesktop.org/documentation/tutorials/basic/dynamic-pipelines.html?gi-language=c

gst-launch-1.0以及gst_parse_launch()在內部自動為您創建此邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM