1. 程式人生 > 實用技巧 >AForge.Net C#的操作視訊,照片讀寫功能

AForge.Net C#的操作視訊,照片讀寫功能

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就是結合這個控制元件來完成。
寫完這個東西,就再研究下虹軟的詳細操作。