AForge.Video.FFMPEG.dll中发生了AccessViolationException错误。

5

我有一个相机类,在这个类中使用了定时器,在其tick事件中,我使用AForge.Net的VideoFileWriter在C++/Cli(x86,.net framework: v4.6)中保存视频。
这不应该发生,因为这是托管代码。但是,即使我包装在try catch块中,程序也会因“AccessViolationException”而崩溃。我已经验证Image不为空。与“VideoFileWriter”有关的问题。这可能发生在应用程序启动到运行30分钟之间的任何时间。

类型为'System.AccessViolationException'的未处理异常发生在AForge.Video.FFMPEG.dll中 其他信息:尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。

在Visual Studio的输出中,我看到

0x0C4D689F(swscalse-2.dll) 中的异常已抛出于test.exe中: 写入位置0x09F83D80时发生 0xC0000005:访问冲突。 异常已抛出:'System.AccessViolationException' in AForge.Video.FFMPEG.dll

代码:

 private: System::Void Video_Recorder_Tick(System::Object^  sender, System::Timers::ElapsedEventArgs^  e)
  {
      Bitmap^ save = ConvertMatToBitmap(image); //function to convert opencv's Mat to .net's Bitmap        
      if(writer!= nullptr)
       writer->WriteVideoFrame(save);
       delete save;
   }

  VideoFileWriter ^writer = gcnew VideoFileWriter();

  private: Void load_VideoWriter()
  {
    writer->Open("C:/video.avi", 640, 480, 10, VideoCodec::Default);        
  }

Visual Studio显示了writer的几个值

BitRate 400000
Codec 默认值
FrameRate 10
Height 480
IsOpen true
Width 640


如果有人需要更多信息,请告诉我。
调用堆栈没有太大帮助

输入图像描述

令我惊讶的是,互联网上没有人遇到这个问题!
代码看起来很简单,可能是什么问题呢?


1
我在C#中遇到了同样的问题。也许这是库中的一个bug?我还没有找到解决方案。 - Episodex
1个回答

3

将编解码器指定为AForge.Video.FFMPEG.VideoCodec.MPEG4,这个错误应该就会消失。


3
谢谢!这个解决了我的问题。在我的情况下,我是通过MemoryStream获取位图,并将编解码器设置为H264。请问(如果您知道的话)为什么MPEG4不会抛出异常,而其他编解码器会?再次感谢! - Pona
@Pona,我甚至不记得使用过这个库。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接