Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WinForms中显示gstreamer sharp视频流_C#_Winforms_Video Streaming_Gstreamer_Gstreamer Sharp - Fatal编程技术网

C# 在WinForms中显示gstreamer sharp视频流

C# 在WinForms中显示gstreamer sharp视频流,c#,winforms,video-streaming,gstreamer,gstreamer-sharp,C#,Winforms,Video Streaming,Gstreamer,Gstreamer Sharp,我正在寻找在WinForms应用程序中显示gstreamer sharp提要的示例/帮助 我正在使用VS 2012,并为此版本的VS构建了“胶水”项目。我的项目还安装了glib sharp、gstreamer sharp并引用了它们。我将gstreamer bin目录设置为项目的工作目录 如果在按钮点击处理程序中有以下代码,我会得到GStreamer D3D视频接收器测试窗口,它会弹出在我的窗体顶部 Gst.Application.Init(); var pipeline = Parse.Lau

我正在寻找在WinForms应用程序中显示gstreamer sharp提要的示例/帮助

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

如果在按钮点击处理程序中有以下代码,我会得到GStreamer D3D视频接收器测试窗口,它会弹出在我的窗体顶部

Gst.Application.Init();
var pipeline = Parse.Launch(@"videotestsrc ! videoconvert ! autovideosink");
pipeline.SetState(State.Playing);
我想让我的应用程序中的流显示在面板或图片盒上


谢谢

在此处查看
GstVideoOverlay
界面:


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

您可以看看您需要调整此代码以使用WinForms的窗口句柄。

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

内部枚举videosinktype{glimagesink、d3dvideosink、dshowvideosink、directdrawsink}
静态元素mVideoTestSource、mVideoCaps、mVideoSink、mAppQueue、mVideoConv;
静态Gst.App.AppSink-mAppSink;
静态System.Threading.Thread mMainGlibThread;
静态GLib.MainLoop mMainLoop;//格利布主回路
私有常量videosinktype mCfgVideosinkType=videosinktype.dshowvideosink;
乌隆·汉德尔私人酒店;
私人Gst.Video.VideoSink mGlImageSink;
私有Gst.Pipeline mCurrentPipeline=null;
私有void InitGStreamerPipeline()
{
//分配句柄以防止跨线程访问
mHandle=(ulong)videoDisplay.Handle;
//初始化Gstreamer
Gst.Application.Init();
GtkSharp.GstreamerSharp.ObjectManager.Initialize();
mMainLoop=newglib.MainLoop();
mMainGlibThread=new System.Threading.Thread(mMainLoop.Run);
mMainGlibThread.Start();
#区域建筑管道
开关(MCFG型)
{
案例videosinktype.glimagesink:
mGlImageSink=(Gst.Video.VideoSink)Gst.ElementFactory.Make(“glimagesink”,“glimagesink”);
打破
案例videosinktype.d3dvideosink:
mGlImageSink=(Gst.Video.VideoSink)Gst.ElementFactory.Make(“d3dvideosink”、“d3dvideosink”);
//mGlImageSink=(Gst.Video.VideoSink)Gst.ElementFactory.Make(“dshowvideosink”,“dshowvideosink”);
打破
案例videosinktype.dshowvideosink:
mGlImageSink=(Gst.Video.VideoSink)Gst.ElementFactory.Make(“dshowvideosink”,“dshowvideosink”);
打破
案例videosinktype.directdrawsink:
mGlImageSink=(Gst.Video.VideoSink)Gst.ElementFactory.Make(“directdrawsink”,“directdrawsink”);
打破
违约:
打破
}
mVideoTestSource=ElementFactory.Make(“videotestsrc”、“videotestsrc0”);
mVideoConv=ElementFactory.Make(“videoconvert”、“VideoConvert0”);
mVideoSink=ElementFactory.Make(“自动视频接收器”、“sink0”);
McCurrentPipeline=新Gst.管道(“管道”);
添加(mVideoTestSource、mVideoConv、mVideoSink、mGlImageSink);
if(!mVideoTestSource.Link(mVideoSink))
if(mUdpcSrc.Link(mVideoSink))
{
System.Diagnostics.Debug.WriteLine(“无法链接元素”);
}
#端区
//订阅总线和总线同步MSG
总线=mCurrentPipeline.Bus;
bus.AddSignalWatch();
总线消息+=HandleMessage;
总线=mCurrentPipeline.Bus;
bus.EnableSyncMessageEmission();
bus.SyncMessage+=新的SyncMessageHandler(bus\u SyncMessage);
//顺流而下
var setStateRet=mcurrentpipline.SetState(State.Null);
System.Diagnostics.Debug.WriteLine(“SetStateNULL返回:”+setStateRet.ToString());
setStateRet=mcurrentpipline.SetState(State.Ready);
System.Diagnostics.Debug.WriteLine(“SetStateReady返回:”+setStateRet.ToString());
setStateRet=mcurrentpipline.SetState(Gst.State.Playing);
}
/// 
/// 
/// 
/// 
///实际上,应用程序需要在正确的时间设置其窗口标识符,以避免内部窗口创建
///从视频接收器元素。为了解决这个问题,总线上会发布一条GstMessage来通知应用程序
///它应该立即设置窗口标识符。
/// 
///API:http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideooverlay.html
/// 
/// 
/// 
专用void总线\u SyncMessage(对象o,SyncMessageArgs args)
{
//方便功能,用于检查给定消息是否是来自GstVideoOverlay的“准备窗口句柄”消息。
System.Diagnostics.Debug.WriteLine(“总线同步消息:+args.Message.Type.ToString());
if(Gst.Video.Global.IsVideoOverlayPrepareWindowHandleMessage(args.Message))
{
元素src=(Gst.Element)args.Message.src;
#如果调试
System.Diagnostics.Debug.WriteLine(“接收到的消息'prepare-window-handle'”+src.Name+“”+src.ToString());
#恩迪夫
如果(src!=null&(src是Gst.Video.VideoSink | src是Gst.Bin))
{
//尝试设置纵横比
尝试
{
src[“力纵横比”]=真;
}
catch(PropertyNotFoundException){}
//尝试设置覆盖
尝试
{
Gst.Video.VideoOverlayAdapter overlay=新的Gst.Video.VideoOverlayAdapter(src.Handle);
叠加。WindowHandle=mHandle;
覆盖把手通风口(真实);
}
catch(异常ex){System.Diagnostics.Debug.WriteLine(“抛出异常:“+ex.Message”);}
}
}
}
私有void HandleMessage(对象o,MessageArgs args)
{
var msg=args.Message;
//System.Diagnostics.Debug.WriteLine(“HandleMessage接收到的消息类型:{0}”,msg.type);
开关(消息类型)
{
案例消息类型。错误:
//