GStreamer (1.14) Pipeline in Python3
Jonathan Baecker
jonbae77 at gmail.com
Wed Dec 26 12:21:48 UTC 2018
Hello,
I try to understand the way Python and gstreamer works together. I'm
able to build a pipeline for only video and that plays just fine, but
when I add audio my pipeline stops by the first frame and put this to
screen.
Can you tell me, what is wrong with my code here?:
#!/usr/bin/env python3
import gi
gi.require_version('Gst', '1.0')
gi.require_version('GLib', '2.0')
from gi.repository import GLib, Gst
# mode debugging infos
Gst.debug_set_active(True)
Gst.debug_set_default_threshold(3)
# callback link pads
def on_new_decoded_pad(dbin, pad):
type = pad.query_caps(None).to_string()
decode = pad.get_parent()
pipeline = decode.get_parent()
if type.startswith("video"):
video_queue = pipeline.get_by_name("video_queue")
decode.link(video_queue)
print("linked video")
if type.startswith("audio"):
audio_queue = pipeline.get_by_name("audio_queue")
decode.link(audio_queue)
print("linked audio")
def main():
Gst.init(None)
# create new pipeline
pipe = Gst.Pipeline.new('pipleline')
# add source and decoder
src = Gst.ElementFactory.make('filesrc', "src")
decode = Gst.ElementFactory.make('decodebin', 'decode')
# video queue and sink
video_queue = Gst.ElementFactory.make('queue', 'video_queue')
video_sink = Gst.ElementFactory.make('autovideosink', 'video_sink')
# audio queue and sink
audio_queue = Gst.ElementFactory.make('queue', 'audio_queue')
audio_convert = Gst.ElementFactory.make('audioconvert',
'audio_convert')
audio_sink = Gst.ElementFactory.make('autovideosink', 'audio_sink')
# set some properties
src.set_property('location', 'test.mp4')
video_sink.set_property('sync', 'true')
audio_sink.set_property('sync', 'true')
# create pipeline
pipe.add(src)
pipe.add(decode)
pipe.add(video_queue)
pipe.add(video_sink)
pipe.add(audio_queue)
pipe.add(audio_convert)
pipe.add(audio_sink)
# link elements
src.link(decode)
video_queue.link(video_sink)
audio_queue.link(audio_convert)
audio_convert.link(audio_sink)
# link decoder to coresponding queue
decode.connect('pad-added', on_new_decoded_pad)
loop = GLib.MainLoop()
# start pipeline in play mode
pipe.set_state(Gst.State.PLAYING)
loop.run()
# cleanup
pipe.set_state(Gst.State.NULL)
if __name__ == '__main__':
main()
I hope it is ok, to post so much code here, when not I can post next
time a gist link.
Regards
Jonathan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20181226/c2685073/attachment.html>
More information about the gstreamer-devel
mailing list