1. 程式人生 > >關於調用攝像頭錄像功能

關於調用攝像頭錄像功能

bject 技術 分辨率 速度 nbsp 變量 bsp 發現 不兼容

之前有說到用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是臨界值

然後就可以錄制啦,收工

關於調用攝像頭錄像功能