【问题标题】:GStreamer XOverlay lost after setting the Playbin state to NULL or READY将 Playbin 状态设置为 NULL 或 READY 后 GStreamer XOverlay 丢失
【发布时间】:2011-11-28 10:01:45
【问题描述】:

我正在使用 OSSBuild 和 gstreamersharp 开发 C# WPF 应用程序。我正在使用 XOverlayAdapter 在我拥有 Windows 句柄的托管 WindowsForms 控件上显示视频。除了我将 playbin2 状态设置为 NULL 或 READY 的情况外,一切都运行良好。这正是我正在做的(如果元素创建正确,我去掉了所有检查):

  1. 创建一个播放箱

    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);
    
  2. 创建视频接收器

    Gst.Video.VideoSink videoSink = 
        Gst.ElementFactory.Make("dshowvideosink") as Gst.Video.VideoSink;
    videoSink["force-aspect-ratio"] = true;
    
  3. 将视频接收器与 WindowsForms 控件(屏幕)相关联,以在我的 WPF 窗口的矩形区域中显示视频。

    Gst.Interfaces.XOverlayAdapter overlayAdapter =
        new Gst.Interfaces.XOverlayAdapter(videoSink.Handle);
    overlayAdapter.XwindowId = (ulong)screen.Handle;
    
  4. 将视频接收器附加到播放箱

    playBin.VideoSink = videoSink;
    
  5. 将 playbin 的 URI 设置为我硬盘上的某个视频文件

    playBin.SetState(Gst.State.Ready);
    playBin.Uri = @"file:///" + fileName.Replace('\\', '/');
    playBin.SetState(Gst.State.Paused);
    
  6. 现在我可以通过改变 playbin 的状态来播放和暂停视频

    playBin.SetState(Gst.State.Playing);
    playBin.SetState(Gst.State.Paused);
    

    到目前为止一切顺利,一切正常,我可以播放、暂停、查找窗口中矩形区域中显示的视频。当我尝试播放另一个视频文件时,问题就开始了。根据网上找到的所有手册,我应该在更改 URI 之前将管道状态设置为 NULL 或 READY:

  7. 打开另一个视频文件

    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


    【解决方案1】:

    解决方案是防止视频接收器改变其状态。 感谢 gstreamer-devel 邮件列表中的 Stefan Sauer。

    playBin.VideoSink.SetLockedState(true);
    playBin.SetState(Gst.State.Ready);
    playBin.Uri = @"file:///" + newFileName.Replace('\\', '/');
    playBin.SetState(Gst.State.Paused);
    playBin.VideoSink.SetLockedState(false);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 2020-04-14
      相关资源
      最近更新 更多