Skip to content

Instantly share code, notes, and snippets.

@matwey
Last active June 15, 2018 10:06
Show Gist options
  • Select an option

  • Save matwey/dae1b888d22752441ded86f414075854 to your computer and use it in GitHub Desktop.

Select an option

Save matwey/dae1b888d22752441ded86f414075854 to your computer and use it in GitHub Desktop.
Python GStreamer player
#!/usr/bin/env python3
import sys, os
import argparse
import gi
gi.require_version('Gst', '1.0')
gi.require_version('Gtk', '3.0')
gi.require_version('GstVideo', '1.0')
from gi.repository import Gst, GObject, Gtk
from gi.repository import GdkX11, GstVideo
class GTK_Main(object):
def __init__(self, uri, title, startup_id, geometry, mute):
window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
window.set_title(title)
if startup_id:
window.set_startup_id(startup_id)
if geometry:
width, height = geometry
window.set_default_size(width, height)
window.connect("destroy", Gtk.main_quit, "WM Destroy")
self.movie_window = Gtk.DrawingArea()
vbox = Gtk.VBox()
vbox.add(self.movie_window)
window.add(vbox)
window.show_all()
self.player = Gst.ElementFactory.make('playbin', 'player')
sink = Gst.ElementFactory.make("glimagesink", "sink")
if not self.player:
raise RuntimeError("Cannot find 'playbin' GStreamer plugin")
self.player.set_property('uri', uri)
self.player.set_property('video-sink', sink)
if mute:
audiosink = Gst.ElementFactory.make("fakesink", "audosink")
self.player.set_property('audio-sink', audiosink)
bus = self.player.get_bus()
bus.add_signal_watch()
bus.enable_sync_message_emission()
bus.connect("message::eos", self._on_message_eos)
bus.connect("message::error", self._on_message_error)
bus.connect("sync-message::element", self._on_sync_message)
self.player.set_state(Gst.State.PLAYING)
def exit(self, widget, data=None):
self.player.set_state(Gst.State.NULL)
Gtk.main_quit()
def _on_message_eos(self, bus, message):
self.player.set_state(Gst.State.NULL)
Gtk.main_quit()
def _on_message_error(self, bus, message):
err, debug = message.parse_error()
print("Error: {} {}".format(err, debug))
self.player.set_state(Gst.State.NULL)
Gtk.main_quit()
def _on_sync_message(self, bus, message):
if message.get_structure().get_name() == 'prepare-window-handle':
sink = message.src
sink.set_property('force-aspect-ratio', True)
sink.set_window_handle(self.movie_window.get_property('window').get_xid())
def geometry(s):
w, h = map(int, s.split("x"))
return w, h
parser = argparse.ArgumentParser(description='Play video using GStreamer.')
parser.add_argument('--uri', required=True, metavar='URI', type=str, help='Video to play')
parser.add_argument('--title', metavar='TITLE', type=str, help='Window title', default=sys.argv[0])
parser.add_argument('--startup_id', metavar='STARTUP_ID', type=str, help='Window startup ID')
parser.add_argument('--geometry', metavar='WIDTHxHEIGHT', type=geometry, help='Initial window geometry')
parser.add_argument('--mute', help='Mute sound', action='store_true')
if __name__ == "__main__":
args = parser.parse_args()
Gst.init(None)
m = GTK_Main(args.uri, args.title, args.startup_id, args.geometry, args.mute)
GObject.threads_init()
Gtk.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment