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”的主要内容,如果未能解决你的问题,请参考以下文章
C#中,已知图片内存的首地址(System.IntPtr类),想通过pictureBox显示于窗口,但提示“参数无效”
使用 SharpDx 或 IMSourceReader 从 mp4 文件中读取第二个音轨流