【问题标题】:DirectShow.Net interfaces issue in F#F# 中的 DirectShow.Net 接口问题
【发布时间】:2015-01-15 06:10:14
【问题描述】:

所以我正在查看 DirectShow.Net 的示例代码,特别是 Capture 文件夹示例下的 PlayCap 示例。您可以下载示例here 它的 C# 格式。它通过将对象转换为接口做了一些有趣的事情。当我尝试在 F# 中忠实地重新创建它时,对象无法正确转换。

C#:

    IVideoWindow  videoWindow = null;
    IMediaControl mediaControl = null;
    IMediaEventEx mediaEventEx = null;
    IGraphBuilder graphBuilder = null;
    ICaptureGraphBuilder2 captureGraphBuilder = null;

然后在GetInterfaces():

      this.graphBuilder = (IGraphBuilder) new FilterGraph();
      this.captureGraphBuilder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();
      this.mediaControl = (IMediaControl) this.graphBuilder;
      this.videoWindow = (IVideoWindow) this.graphBuilder;
      this.mediaEventEx = (IMediaEventEx) this.graphBuilder;

所以我在 F# 中为我的代码做的就是这个:

    let mutable videoWindow:  IVideoWindow = null;
    let mutable mediaControl: IMediaControl  = null;
    let mutable mediaEventEx: IMediaEventEx  = null;
    let mutable graphBuilder: IGraphBuilder  = null;
    let mutable captureGraphBuilder: ICaptureGraphBuilder2  = null;

后来在GetInterfaces():

        graphBuilder <- new FilterGraph() :>  IGraphBuilder
        captureGraphBuilder <-  new CaptureGraphBuilder2() :> ICaptureGraphBuilder2
        mediaControl <- graphBuilder :> IMediaControl;
        videoWindow <- graphBuilder :> IVideoWindow;
        mediaEventEx <- graphBuilder :> IMediaEventEx;

它看起来像一个忠实的娱乐。甚至不使用功能样式。我正在查看msdn 在 F# 中的铸造,看看我是否做得正确。看起来像我,虽然他们有 1 个例子,而且它在本质上非常少。

问题是我得到了错误:

类型约束不匹配。 'FilterGraph' 类型与 'IGraphBuilder' 类型不兼容

我得到每个类似的错误。我也尝试过使用:?&gt;

【问题讨论】:

标签: f# directshow.net c#-to-f#


【解决方案1】:

我发现自己遇到了类似的问题,事实证明,在 C# 中可以将 GUID 属性添加到 COM 接口和 COM 实现,并且该类将显示为该接口的有效实现。然而,F# 类型系统更严格,不允许这样做。您可以使用 unbox 函数来分配它们

graphBuilder <- unbox (new FilterGraph())
captureGraphBuilder <- unbox (new CaptureGraphBuilder2())

【讨论】:

  • 我很感激这个答案,这样我就知道如何解决这种类型的未来问题。但就目前而言,我已转而使用 Aforge 的 Directshow.NET 实现来进行视频捕获,因为它更简单,使用的样板代码更少。
猜你喜欢
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多