背景:我正在研究下采样的效果,然后上采样视频文件。我正在使用Media Foundation .NET在C#中公开MF。程序目前经历以下过程:
我正在使用的解决方案是:
当前情况:几乎完美无缺。我运行了下采样过程并有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优化。
关于下一步要去哪看的任何想法?
答案 0 :(得分:0)
原来这是Media Foundation .NET界面的问题,而不是底层的MF框架。我用C ++构建了一个小型测试程序,它实现了代码的关键部分,并且运行良好。
不确定为什么Media Foundation .NET会导致问题,但解决方案只是设置属性: MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING 而不是 MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING
启用高级处理后,它的行为正常。