我有一个相机类,在这个类中使用了定时器,在其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
如果有人需要更多信息,请告诉我。
调用堆栈没有太大帮助
令我惊讶的是,互联网上没有人遇到这个问题!
代码看起来很简单,可能是什么问题呢?