在WinForms中显示gstreamer-sharpvideo流

我正在寻找一个示例/帮助在WinForms应用程序中显示gstreamer-sharp feed。

我正在使用VS 2012,并为此版本的VS构建了“胶水”项目。 我的项目也安装了glib-sharp,gstreamer-sharp。 我将gstreamer bin目录设置为我项目的工作目录。

如果在按钮单击处理程序中有以下代码,我会在表单上弹出GStreamer D3Dvideo接收器测试窗口。

Gst.Application.Init(); var pipeline = Parse.Launch(@"videotestsrc ! videoconvert ! autovideosink"); pipeline.SetState(State.Playing); 

我想在我正在思考的Panel或PictureBox上显示我的应用程序中的流。

谢谢!

下面的代码将使测试流显示在WinForm的面板控件上。

 internal enum videosinktype { glimagesink, d3dvideosink, dshowvideosink, directdrawsink} static Element mVideoTestSource, mVideoCaps, mVideoSink, mAppQueue, mVideoConv; static Gst.App.AppSink mAppSink; static System.Threading.Thread mMainGlibThread; static GLib.MainLoop mMainLoop; // GLib's Main Loop private const videosinktype mCfgVideosinkType = videosinktype.dshowvideosink; private ulong mHandle; private Gst.Video.VideoSink mGlImageSink; private Gst.Pipeline mCurrentPipeline = null; private void InitGStreamerPipeline() { //Assign Handle to prevent Cross-Threading Access mHandle = (ulong)videoDisplay.Handle; //Init Gstreamer Gst.Application.Init(); GtkSharp.GstreamerSharp.ObjectManager.Initialize(); mMainLoop = new GLib.MainLoop(); mMainGlibThread = new System.Threading.Thread(mMainLoop.Run); mMainGlibThread.Start(); #region BuildPipeline switch (mCfgVideosinkType) { case videosinktype.glimagesink: mGlImageSink = (Gst.Video.VideoSink)Gst.ElementFactory.Make("glimagesink", "glimagesink"); break; case videosinktype.d3dvideosink: mGlImageSink = (Gst.Video.VideoSink)Gst.ElementFactory.Make("d3dvideosink", "d3dvideosink"); //mGlImageSink = (Gst.Video.VideoSink)Gst.ElementFactory.Make("dshowvideosink", "dshowvideosink"); break; case videosinktype.dshowvideosink: mGlImageSink = (Gst.Video.VideoSink)Gst.ElementFactory.Make("dshowvideosink", "dshowvideosink"); break; case videosinktype.directdrawsink: mGlImageSink = (Gst.Video.VideoSink)Gst.ElementFactory.Make("directdrawsink", "directdrawsink"); break; default: break; } mVideoTestSource = ElementFactory.Make("videotestsrc", "videotestsrc0"); mVideoConv = ElementFactory.Make("videoconvert", "vidconvert0"); mVideoSink = ElementFactory.Make("autovideosink", "sink0"); mCurrentPipeline = new Gst.Pipeline("pipeline"); mCurrentPipeline.Add(mVideoTestSource, mVideoConv, mVideoSink, mGlImageSink); if (!mVideoTestSource.Link(mVideoSink)) if (mUdpcSrc.Link(mVideoSink)) { System.Diagnostics.Debug.WriteLine("Elements could not be linked"); } #endregion //subscribe to bus & bussync msgs Bus bus = mCurrentPipeline.Bus; bus.AddSignalWatch(); bus.Message += HandleMessage; Bus bus = mCurrentPipeline.Bus; bus.EnableSyncMessageEmission(); bus.SyncMessage += new SyncMessageHandler(bus_SyncMessage); //play the stream var setStateRet = mCurrentPipeline.SetState(State.Null); System.Diagnostics.Debug.WriteLine("SetStateNULL returned: " + setStateRet.ToString()); setStateRet = mCurrentPipeline.SetState(State.Ready); System.Diagnostics.Debug.WriteLine("SetStateReady returned: " + setStateRet.ToString()); setStateRet = mCurrentPipeline.SetState(Gst.State.Playing); } ///  /// ///  ///  /// Indeed the application needs to set its Window identifier at the right time to avoid internal Window creation /// from the video sink element. To solve this issue a GstMessage is posted on the bus to inform the application /// that it should set the Window identifier immediately. /// /// API: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideooverlay.html ///  ///  ///  private void bus_SyncMessage(object o, SyncMessageArgs args) { //Convenience function to check if the given message is a "prepare-window-handle" message from a GstVideoOverlay. System.Diagnostics.Debug.WriteLine("bus_SyncMessage: " + args.Message.Type.ToString()); if (Gst.Video.Global.IsVideoOverlayPrepareWindowHandleMessage(args.Message)) { Element src = (Gst.Element)args.Message.Src; #if DEBUG System.Diagnostics.Debug.WriteLine("Message'prepare-window-handle' received by: " + src.Name + " " + src.ToString()); #endif if (src != null && (src is Gst.Video.VideoSink | src is Gst.Bin)) { // Try to set Aspect Ratio try { src["force-aspect-ratio"] = true; } catch (PropertyNotFoundException) { } // Try to set Overlay try { Gst.Video.VideoOverlayAdapter overlay_ = new Gst.Video.VideoOverlayAdapter(src.Handle); overlay_.WindowHandle = mHandle; overlay_.HandleEvents(true); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("Exception thrown: " + ex.Message); } } } } private void HandleMessage (object o, MessageArgs args) { var msg = args.Message; //System.Diagnostics.Debug.WriteLine("HandleMessage received msg of type: {0}", msg.Type); switch (msg.Type) { case MessageType.Error: // GLib.GException err; string debug; System.Diagnostics.Debug.WriteLine("Error received: " + msg.ToString()); //msg.ParseError (out err, out debug); //if(debug == null) { debug = "none"; } //System.Diagnostics.Debug.WriteLine ("Error received from element {0}: {1}", msg.Src, err.Message); //System.Diagnostics.Debug.WriteLine ("Debugging information: "+ debug); break; case MessageType.StreamStatus: Gst.StreamStatusType status; Element theOwner; msg.ParseStreamStatus(out status, out theOwner); System.Diagnostics.Debug.WriteLine("Case SteamingStatus: status is: " + status + " ; Ownder is: " + theOwner.Name); break; case MessageType.StateChanged: //System.Diagnostics.Debug.WriteLine("Case StateChanged: " + args.Message.ToString()); State oldState, newState, pendingState; msg.ParseStateChanged(out oldState, out newState, out pendingState); if (newState == State.Paused) args.RetVal = false; System.Diagnostics.Debug.WriteLine("Pipeline state changed from {0} to {1}: ; Pending: {2}", Element.StateGetName(oldState), Element.StateGetName(newState), Element.StateGetName(pendingState)); break; case MessageType.Element: System.Diagnostics.Debug.WriteLine("Element message: {0}", args.Message.ToString()); break; default: System.Diagnostics.Debug.WriteLine("HandleMessage received msg of type: {0}", msg.Type); break; } args.RetVal = true; } 

在这里查看GstVideoOverlay界面:

https://developer.gnome.org/gst-plugins-libs/stable/gst-plugins-base-libs-gstvideooverlay.html

我猜你必须适应C#语法,但是有大量的解释和代码示例。

您可以查看https://cgit.freedesktop.org/gstreamer/gstreamer-sharp/tree/samples/VideoOverlay.cs您需要调整此代码以使用WinForms的Handle窗口。