Accord .Net中WriteVideoFrame无法识别Bitmap参数的问题求助
解决Accord.NET WriteVideoFrame参数无效的问题
核心问题排查
1. 视频分辨率参数顺序错误
你的writer.Open方法中宽度和高度参数顺序写反了。Accord.NET的VideoFileWriter.Open方法定义为:
public void Open(string fileName, int width, int height, int frameRate, VideoCodec codec);
你传入的是frameHeight作为第一个尺寸参数、frameWidth作为第二个,这会导致视频文件分辨率与实际捕获帧的分辨率不匹配,触发参数无效错误。
2. Graphics对象锁定Bitmap导致写入失败
在videoSourcePlayer_NewFrame事件中,你通过Graphics.FromImage(args.Frame)创建了Graphics对象,但在调用WriteVideoFrame前未释放该对象,这会导致Bitmap被锁定,无法被视频写入器访问。
3. 原帧可能被后续操作复用
Accord.NET的NewFrameEventArgs.Frame是复用对象,直接写入可能引发资源冲突,建议克隆帧后再进行写入操作。
修复后的代码
1. 修正视频打开的分辨率参数顺序
修改button1_Click中的Open调用:
private void button1_Click(object sender, EventArgs e) { writer = new VideoFileWriter(); // 注意参数顺序:width在前,height在后 writer.Open("ruta_del_video.mp4", frameWidth, frameHeight, 30, VideoCodec.MPEG4); }
2. 调整Graphics释放时机并克隆帧
修改videoSourcePlayer_NewFrame方法:
private void videoSourcePlayer_NewFrame(object sender, NewFrameEventArgs args) { DateTime now = DateTime.Now; // 克隆原帧,避免锁定或复用冲突 using (Bitmap frameClone = new Bitmap(args.Frame)) { using (Graphics g = Graphics.FromImage(frameClone)) { // 可在此添加绘制操作,比如时间戳 g.DrawString(now.ToString(), SystemFonts.DefaultFont, Brushes.Red, 10, 10); } if (writer != null && writer.IsOpen) { writer.WriteVideoFrame(frameClone); } } }
3. 完善资源释放逻辑
确保button2_Click中的释放逻辑安全,避免空引用:
private void button2_Click(object sender, EventArgs e) { if (writer != null) { if (writer.IsOpen) writer.Close(); writer.Dispose(); writer = null; } }
额外注意事项
- 确保
frameWidth和frameHeight在摄像头初始化后正确赋值,可在OpenVideoSource中添加非零检查,避免无效尺寸。 - 测试时使用绝对路径保存视频(比如
@"C:\temp\record.mp4"),避免相对路径导致的文件访问问题。 - 确认项目已正确引用Accord.Video.FFMPEG的原生库(x86/x64的ffmpeg相关dll),缺失库也可能引发写入失败。
内容的提问来源于stack exchange,提问作者Jersson Garzon
相关产品推荐
相关产品推荐

