我有一个相机类,在这个课程中我使用了一个计时器,在我的tick事件中,我使用AForge.Net
的C ++ / Cli中的VideoFileWriter保存视频(x86,.net framework:v4。 6)。
这不应该发生,因为这是托管代码。但即使我在try catch块中包装,程序也因AccessViolationException
而崩溃。我已经验证Image不是null。与VideoFileWriter
有关。这种情况会在应用开始到运行30分钟之间的任何时间发生。
未处理的类型' System.AccessViolationException' 发生在AForge.Video.FFMPEG.dll中 附加信息:尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。
在Visual Studio的输出中,我看到了
test.exe中的0x0C4D689F(swscale-2.dll)抛出异常:0xC0000005:访问冲突写入位置0x09F83D80。 抛出异常:' System.AccessViolationException'在 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
编解码器默认值
FrameRate 10
高度480
IsOpen是真的 宽度640
如果有人需要更多信息,请告诉我
调用堆栈没有多大帮助
令我惊讶的是,互联网上没有人有这个问题! 代码似乎很直接,可能是什么问题?
答案 0 :(得分:2)
将编解码器指定为AForge.Video.FFMPEG.VideoCodec.MPEG4,该错误应消失。