AForge.Net C#的操作視訊,照片讀寫功能
阿新 • • 發佈:2020-07-09
AForge.Net C#的操作視訊,照片讀寫功能
文章作者
關鍵詞
摘要
引言
背景
最近在學習人臉識別,最趁手的還是.Net,所以還是現在C#的懷抱裡學習瞭解了。第一站就是AForge。
需求
基本的視訊操作:
現狀
維護到2013年,不知道有沒有更新的中介軟體了。
必要性
預期目標
自如的控制視訊,圖片等。
實現
主要技術背景
配合AForge的控制元件和視訊裝置或者檔案使用,將視訊裝置或者檔案作為源,即可實現。感覺很方便,很符合C#的操作習慣
設計思路
拖一個視訊控制元件,然後獲得視訊裝置資訊,將視訊裝置作為控制元件的源,就可以顯示了。
基本操作
1 準備工作
using AForge.Video.DirectShow;
private FilterInfoCollection filterInfoCollection;
private VideoCaptureDevice rgbVideoDevice;
同時,你拖一個視訊控制元件到winform上。
2 獲得裝置資訊
filterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);
3 例項化視訊裝置
if(rgbVideoDevice!=null)
{
rgbVideoDevice=new VideoCaptureDevice(((FilterInfo)filterInfoCollection[0]).MonikerString);
}
4 關聯控制元件源和裝置,並開始
vsp1.VideoSource = rgbVideoDevice; vsp1.Start();
5 播放視訊(使用視訊作為源)
先定義一個源。
private FileVideoSource fileVideo;
用檔案路徑例項化一個檔案源
fileVideo = new FileVideoSource("hhha1.avi");
關聯控制元件源並開始
vsp1.VideoSource = fileVideo;
vsp1.Start();
進階操作
儲存圖片
if(rgbVideoDevice.IsRunning)
{
currentpic = vsp1.GetCurrentVideoFrame();
string filepath1 = @"hhha1.jpg";
currentpic.Save(filepath1);
//pictureBox1.Image = Image.FromHbitmap(currentpic.GetHbitmap());//為啥要有這樣一個轉換?
}
錄製視訊
這個稍微麻煩一點,還有幾個坑
坑就不詳細介紹了,給個連結跳坑連結
通過 VideoFileWriter進行操作。
private VideoFileWriter writer;
例項化一個VideoFileWriter
開始錄製。
writer = new VideoFileWriter();
然後通過writer將檔案和視訊控制元件連結起來
string filepath1 = @"hhha1.avi";
if (rgbVideoDevice.IsRunning)
{
writer.Open(filepath1, width, height, fps,VideoCodec.MPEG4);
}
相當於開啟檔案的口袋,這樣還不能儲存視訊,還需要有個引擎或驅動將視訊的每一幀推到檔案裡。因為是一個引擎,他需要在錄製期間一直工作,所以我們需要一個一直執行的事件來做這個事情,一個簡單的辦法是通過視訊控制元件的paint來實現。
首先我們需要一個推送的函式
private void writeVideo2file(Bitmap img1)
{
//if(isWriter&&writer.IsOpen)
if (writer.IsOpen)
{
writer.WriteVideoFrame(img1);
}
}
當然也可以將writer作為引數,以便獲得更高的靈活性。
然後就可以讓視訊控制元件的paint事件幫我們推到檔案裡了
private void videoSourcePlayer1_Paint(object sender, PaintEventArgs e)
{
if(vsp1.IsRunning)
{
using (Bitmap img1 = vsp1.GetCurrentVideoFrame())
{
writeVideo2file(img1);
}
}
}
當然你還得記得關掉writer
if(vsp1.IsRunning)
{
vsp1.SignalToStop();
}
注意事項
winfrom的closed事件記得要關閉裝置
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if(vsp1.IsRunning)
{
vsp1.SignalToStop();
}
}
結束語
簡單好用。虹軟的demo就是結合這個控制元件來完成。
寫完這個東西,就再研究下虹軟的詳細操作。