ich versuche mich gerade in die GStreamer Python Bindings einzuarbeiten. Video alleine kann ich schon abspielen, aber sobald ich noch Audio dazu tun will klappt es nicht mehr. Es wird zwar das Videofenster angezeigt, bleibt aber beim ersten Frame stehen.
Verwende Python3 mit gstreamer 1.14 unter Fedora. Hier ist mein Code:
Code: Alles auswählen
#!/usr/bin/env python3
import gi
gi.require_version('Gst', '1.0')
gi.require_version('GLib', '2.0')
from gi.repository import GLib, Gst
Gst.debug_set_active(True)
Gst.debug_set_default_threshold(3)
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 audo")
def main():
Gst.init(None)
pipe = Gst.Pipeline.new('pipleline')
src = Gst.ElementFactory.make('filesrc', "src")
decode = Gst.ElementFactory.make('decodebin', 'decode')
video_queue = Gst.ElementFactory.make('queue', 'video_queue')
video_sink = Gst.ElementFactory.make('autovideosink', 'video_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')
src.set_property('location', 'voice.mp4')
video_sink.set_property('sync', 'true')
audio_sink.set_property('sync', 'true')
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)
src.link(decode)
video_queue.link(video_sink)
audio_queue.link(audio_convert)
audio_convert.link(audio_sink)
decode.connect('pad-added', on_new_decoded_pad)
loop = GLib.MainLoop()
pipe.set_state(Gst.State.PLAYING)
loop.run()
# cleanup
pipe.set_state(Gst.State.NULL)
if __name__ == '__main__':
main()
Grüße
Jonathan