Media Foundation:ReadSample - 访问冲突异常

时间:2018-05-01 13:12:32

标签: c# c++ media access-violation foundation

背景:我正在研究下采样的效果,然后上采样视频文件。我正在使用Media Foundation .NET在C#中公开MF。程序目前经历以下过程:

  • 拍摄高分辨率视频并阅读每一帧(SourceReader和ReadSample)
  • 使用在字节级操作的自定义代码下传示例
  • 将下采样数据写入新的低分辨率视频文件(使用SinkWriter)
  • 对Media Foundation支持的一系列分辨率重复
  • 使用自定义代码操作每个字节,将采样后的视频重新读入下方列表中的下一个更高分辨率。
  • 将新数据写入更高的res文件(再次使用SinkWriter)

我正在使用的解决方案是:

  • 2560,1440
  • 2346,1320
  • 2134,1200
  • 1920,1080
  • 1706,960
  • 1494,840
  • 1280,720
  • 1068,600
  • 854480
  • 640360
  • 428240
  • 214120

当前情况几乎完美无缺。我运行了下采样过程并有11个下采样视频文件(上面列表中每个分辨率一个),加上原始的1440p视频。然后,我阅读了这11个视频中的每个视频和样本。它适用于其中10个。

问题:当我尝试将(1280,720)视频上传至样本(1494,840)时,我得到:

System.AccessViolationException:'尝试读取或写入受保护的内存。这通常表明其他内存已损坏。'

...当我尝试读取第一帧时。我无法弄清楚为什么。 SourceReader配置正常(至少没有错误返回)。我做像Marshal.Copy这样的事情来将采样的帧数据放入托管内存空间,我最初认为这是问题所在。代码并没有那么远 - 只要我尝试读取第一帧样本时就会出错。 ReadSample位于Try ... Catch块中,但异常仍未处理,因此没有返回其他错误信息。

我不想只是开始粘贴无用的代码,所以请让我知道什么是有用的,我会添加到问题中。大部分代码都来自SourceReader和SinkWriter的MS教程。另外值得记住的是,这在大多数情况下都有效,因此代码不会被“破坏”。

我尝试在Release和Debug,x86和x64中进行编译。还尝试在Visual Studio选项中抑制JIT优化。

关于下一步要去哪看的任何想法?

1 个答案:

答案 0 :(得分:0)

原来这是Media Foundation .NET界面的问题,而不是底层的MF框架。我用C ++构建了一个小型测试程序,它实现了代码的关键部分,并且运行良好。

不确定为什么Media Foundation .NET会导致问题,但解决方案只是设置属性: MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING 而不是 MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING

启用高级处理后,它的行为正常。