// Authors // Copyright (C) 2014 Stephan Sundermann using System; using Gst; using System.Runtime.InteropServices; namespace GstreamerSharp { class Playback { static bool IsLive; static Element Pipeline; static GLib.MainLoop MainLoop; public static void Main (string[] args) { // Initialize GStreamer Application.Init (ref args); // Build the pipeline Pipeline = Parse.Launch ("playbin uri=http://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4"); var bus = Pipeline.Bus; // Start playing var ret = Pipeline.SetState (State.Playing); if (ret == StateChangeReturn.Failure) { Console.WriteLine ("Unable to set the pipeline to the playing state."); return; } else if (ret == StateChangeReturn.NoPreroll) { IsLive = true; } MainLoop = new GLib.MainLoop (); bus.AddSignalWatch (); bus.Message += HandleMessage; MainLoop.Run (); // Free resources Pipeline.SetState (State.Null); } static void HandleMessage (object o, MessageArgs args) { var msg = args.Message; switch (msg.Type) { case MessageType.Error: { GLib.GException err; string debug; msg.ParseError (out err, out debug); Console.WriteLine ("Error: {0}", err.Message); Pipeline.SetState (State.Ready); MainLoop.Quit (); break; } case MessageType.Eos: // end-of-stream Pipeline.SetState (State.Ready); MainLoop.Quit (); break; case MessageType.Buffering: { int percent = 0; // If the stream is live, we do not care about buffering. if (IsLive) break; percent = msg.ParseBuffering (); Console.WriteLine ("Buffering ({0})", percent); // Wait until buffering is complete before start/resume playing if (percent < 100) Pipeline.SetState (State.Paused); else Pipeline.SetState (State.Playing); break; } case MessageType.ClockLost: // Get a new clock Pipeline.SetState (State.Paused); Pipeline.SetState (State.Playing); break; default: // Unhandled message break; } } } }