SharpDx:无法从“System.IntPtr”转换为“SharpDX.MediaFoundation.IByteStream”

Posted

技术标签:

【中文标题】SharpDx:无法从“System.IntPtr”转换为“SharpDX.MediaFoundation.IByteStream”【英文标题】:SharpDx: Cannot convert from 'System.IntPtr' to 'SharpDX.MediaFoundation.IByteStream' 【发布时间】:2021-11-08 05:05:51 【问题描述】:

当我更新我的 SharpDX.MediaFoundation 参考时,它开始出现此错误:

错误 CS1503 参数 2:无法从“System.IntPtr”转换为“SharpDX.MediaFoundation.IByteStream”

using (var ma = new MediaAttributes())

    // note this doesn't mean you *will* have a hardware transform. Intel Media SDK sometimes is not happy with configuration for HDCP issues.
    ma.Set(SinkWriterAttributeKeys.ReadwriteEnableHardwareTransforms, Options.EnableHardwareTransforms ? 1 : 0);
    ma.Set(SinkWriterAttributeKeys.D3DManager, _devManager.Value);
    // by default, the sink writer's WriteSample method limits the data rate by blocking the calling thread.
    // this prevents the application from delivering samples too quickly.
    // to disable this behavior, set the attribute to 1
    ma.Set(SinkWriterAttributeKeys.DisableThrottling, Options.DisableThrottling ? 1 : 0);
    ma.Set(SinkWriterAttributeKeys.LowLatency, Options.LowLatency);
    Trace("CreateSinkWriterFromURL path:" + RecordFilePath);
    writer = MediaFactory.CreateSinkWriterFromURL(RecordFilePath, IntPtr.Zero, ma);

代码的错误部分与CreateSinkWriterFromURL方法调用有关,看来是IntPtr.Zero引起了问题。

问题解决了。 : 使用 null 而不是 IntPtr.Zero

【问题讨论】:

使用 null 而不是 IntPtr.Zero。 谢谢。它有效。 【参考方案1】:

底层Windows API函数MFCreateSinkWriterFromURL写成如下:

HRESULT MFCreateSinkWriterFromURL(
  LPCWSTR       pwszOutputURL,
  IMFByteStream *pByteStream,
  IMFAttributes *pAttributes,
  IMFSinkWriter **ppSinkWriter
);

很难找到有关 SharpDx 托管库的任何文档(实际上,它是 here,但它并不漂亮)。该项目不再维护,但如果托管代码的原始编写者遵循任何类型的约定,他们可能会在调用外部非托管代码时保持这些参数的顺序相同。您的错误本质上是在说“当我期望 IByteStream 时,您正在向我传递 IntPtr。”

我能在 GitHub 上找到的唯一开源代码是这个 SuperMFLib 存储库,它是一种“适配器/包装器”,因为他们称之为 SharpDx 库。它包含您似乎正在调用的这个CreateSinkWriterFromURL 方法,但是它的方法签名只需要两个参数,而不是四个(但是该文件已经有将近六年的历史了)。您说您最近更新了对库的引用,所以我猜您使用的版本与升级到的版本之间发生了一些变化。

【讨论】:

以上是关于SharpDx:无法从“System.IntPtr”转换为“SharpDX.MediaFoundation.IByteStream”的主要内容,如果未能解决你的问题,请参考以下文章

System.IntPtr.cs

C#中,已知图片内存的首地址(System.IntPtr类),想通过pictureBox显示于窗口,但提示“参数无效”

使用 SharpDx 或 IMSourceReader 从 mp4 文件中读取第二个音轨流

带有效果的 Windows 8.1 应用音频(NAudio 或 SharpDX)

使用 SharpDX 在 WPF 中滚动图像时出现生涩动画

SharpDX初学者教程第1部分:在Visual Studio 2013中设置SharpDX项目