【发布时间】:2011-11-28 10:01:45
【问题描述】:
我正在使用 OSSBuild 和 gstreamersharp 开发 C# WPF 应用程序。我正在使用 XOverlayAdapter 在我拥有 Windows 句柄的托管 WindowsForms 控件上显示视频。除了我将 playbin2 状态设置为 NULL 或 READY 的情况外,一切都运行良好。这正是我正在做的(如果元素创建正确,我去掉了所有检查):
-
创建一个播放箱
Gst.BasePlugins.PlayBin2 playBin = new Gst.BasePlugins.PlayBin2(); playBin.PlayFlags &= ~((Gst.BasePlugins.PlayBin2.PlayFlagsType)(1 << 2)); playBin.Bus.AddSignalWatch(); playBin.Bus.EnableSyncMessageEmission(); playBin.Bus.Message += new Gst.MessageHandler(OnPlayBinMessage); -
创建视频接收器
Gst.Video.VideoSink videoSink = Gst.ElementFactory.Make("dshowvideosink") as Gst.Video.VideoSink; videoSink["force-aspect-ratio"] = true; -
将视频接收器与 WindowsForms 控件(屏幕)相关联,以在我的 WPF 窗口的矩形区域中显示视频。
Gst.Interfaces.XOverlayAdapter overlayAdapter = new Gst.Interfaces.XOverlayAdapter(videoSink.Handle); overlayAdapter.XwindowId = (ulong)screen.Handle; -
将视频接收器附加到播放箱
playBin.VideoSink = videoSink; -
将 playbin 的 URI 设置为我硬盘上的某个视频文件
playBin.SetState(Gst.State.Ready); playBin.Uri = @"file:///" + fileName.Replace('\\', '/'); playBin.SetState(Gst.State.Paused); -
现在我可以通过改变 playbin 的状态来播放和暂停视频
playBin.SetState(Gst.State.Playing); playBin.SetState(Gst.State.Paused);到目前为止一切顺利,一切正常,我可以播放、暂停、查找窗口中矩形区域中显示的视频。当我尝试播放另一个视频文件时,问题就开始了。根据网上找到的所有手册,我应该在更改 URI 之前将管道状态设置为 NULL 或 READY:
-
打开另一个视频文件
playBin.SetState(Gst.State.Ready); playBin.Uri = @"file:///" + newFileName.Replace('\\', '/'); playBin.SetState(Gst.State.Playing);
不幸的是,这会导致我的窗口中的矩形区域变成黑色,并由 GStreamer 创建一个单独的窗口。它与更改 URI 无关,它将 playbin 状态设置为 NULL 或 READY,从而断开视频输出与叠加层的连接。我做错了什么?
【问题讨论】:
标签: c# .net video gstreamer multimedia