之前有说到用Aforge去调用笔记本上的自带摄像头进行拍照,然后我就想既然能拍照,那么应该也是可以录像,于是我就去百度了怎么实现这个功能。然后我在这里把我遇到的几个坑给说一哈。

首先第一个就是按着百度中别人的例子,发现我的项目中没有VideoFileWriter这个类,而别人的项目确有,然后我就看了一下aforge的版本,发现我用的版本比较早,所以我更新了新的2013年的aforge就有这个类了。我将新的aforge上传到网盘https://pan.baidu.com/s/1i5mmKlR

微云https://share.weiyun.com/73e88808612fc2ac523f76c49a79e8ea

第二个坑还是VideoFileWriter这个类,在new实例化的时候,报错,什么版本不兼容什么的,有两个需要改的,第一给就是将aforge文件里面的ffmpeg文件夹里面的dll放到项目的bin-》debug中,第二个是在项目右键属性

然后选择生成,将生成平台选择x86,因为我之前有改成x64,所以运行不了

 

第三个坑就是将从摄像头获取的图像写入到视频文件中,我当时是直接调用VideoFileWriter这个类实例化的对象,然后用里面的Open方法,将视频的路径,视频的分辨率,和视频的播放帧数传,视频的格式类型传进去,然后开始录,发现录完后视频只有几k的大小,打开后视频是黑的,然后就一直搞不懂是哪里出错了。跑回去看别人写好的代码是怎么录制的,发现他们里面有写了一个摄像头的事件

videoSource.NewFrame += new NewFrameEventHandler(VideoSource_NewFrame);//添加事件,不断从摄像头获取每一帧写到视频文件中

videoSource是VideoCaptureDevice这个类的对象,然后NewFrame这个事件估计是每一帧调用一次,然后将每一帧的图像写到视频文件中,代码这样子的:

/// <summary>
/// 摄像头每一帧事件,不断将每一帧的图像传输到视频文件中
/// </summary>
/// <param name="sender"></param>
/// <param name="eventArgs"></param>
private void VideoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap bitmap = eventArgs.Frame;//从摄像头中获取每一帧的图像

if (isRecord)
{

writer.WriteVideoFrame(bitmap);
}
}

里面写了一个bool的变量来控制开始录像和结束录像

写道这了,视频可以录制了,但是还有一个问题,那就是我之前以为open里面传的帧数设置是录制的视频的帧数质量,那我像帧数高一点,播放的效果好一点啊,然后我就设置成30帧,然后就发现录制出来的10秒视频3秒钟就播放完了,就像在快进一样,去百度了,才发现是帧数设置过高的原因。这里的帧数是每秒播放几帧,并不是用来控制录像的每秒录几帧,帧数调高会使播放速度变快,反之变慢,9是临界值

然后就可以录制啦,收工