媒体基础:读取示例 - 访问冲突异常

Media Foundation: ReadSample - Access Violation Exception

本文关键字:访问冲突 异常 读取 媒体      更新时间:2023-10-16

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

  • 拍摄高分辨率视频并在每一帧中读取(SourceReader & ReadSample(
  • 使用在字节级别操作的自定义代码进行下采样
  • 将向下采样的数据写入新的低分辨率视频文件(使用 SinkWriter(
  • 对媒体基础支持的一系列分辨率重复此操作
  • 再次
  • 使用操作每个字节的自定义代码将采样视频读回和向上读取采样到下面列表中的下一个更高分辨率
  • 将新数据写入更高分辨率的文件(再次使用 SinkWriter(

我正在使用的分辨率是:

  • 2560,1440
  • 2346,1320
  • 2134,1200
  • 1920,1080
  • 1706,960
  • 1494,840
  • 1280,720
  • 1068,600
  • 854,480
  • 640,360
  • 428,240
  • 214,120

现状:几乎完美地工作。 我运行了向下采样过程,并有 11 个向下采样的视频文件(上面列表中的每种分辨率一个(,以及原始的 1440p 视频。 然后,我阅读了这 11 个视频中的每一个和样本。 它适用于其中的 10 个。

问题:当我尝试将 (1280,720( 视频提升到 (1494,840( 时,我得到:

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

。当我尝试在第一帧中阅读时。 我不知道为什么。 源读取器配置正常(至少没有错误返回(。我执行诸如Marshal.Copy之类的操作,将采样的帧数据放入托管内存空间,我最初认为这是问题所在。 代码并没有走那么远 - 只是在我尝试读取第一帧示例时出错。读取样本正在尝试...catch 块,但异常仍未处理,因此不返回其他错误信息。

我不想只是开始粘贴无用的代码,所以请让我知道什么是有用的,我会补充这个问题。 大部分代码取自SourceReader和SinkWriter的MS教程。 还值得记住的是,这在大多数情况下都有效,因此代码不会因此而"损坏"。

我尝试在发布和调试、x86 和 x64 中进行编译。 还尝试在Visual Studio选项中抑制JIT优化。

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

事实证明,这是媒体基础.NET接口的问题,而不是底层MF框架的问题。 我在C++构建了一个小型测试程序,该程序实现了代码的关键部分,并且运行良好。

不知道为什么媒体基础.NET会导致问题,但解决方案只是设置属性: MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING 而不是 MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING

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