AVIファイルの読み書き

今回の課題は非圧縮のAVIファイルとのBitmapファイルのやり取りだ。
AForge.NETを利用する、http://www.aforgenet.com/、このブログを書いている時点で最新バージョンは2.2.5である。

準備

  • 上記のサイトの"download"からzipファイルをダウンロード
  • 適当なフォルダ(自分のVisual StudioのProjectフォルダ)に解凍
  • Visual Studioを開き、使用するプロジェクトを作成
  • Solution Explorerで、プロジェクトを右クリックし、"Add" -> "Reference..."を選択
  • Browseボタンを押し、先ほど解凍したAForge.NETの"Release"フォルダから、"AForge.Video.VFW.dll"を追加、"AForge.Video"も自動で追加されるはず
  • 使用するClassで"using AForge.Video.VFW"、"using System.Drawing"ディレクティブを追加

AVIファイルを開いて、各フレームデータを取得する


AVIReader AVIReader = new AVIReader();
AVIReader.Open(stringAVIfilename);
int AVIWidth = AVIReader.Width;
int AVIHeight = AVIReader.Height;
float AVIFPS = AVIReader.FrameRate;
int TotalNumOfFrames = AVIReader.Length;
Bitmap[] bitmapFrames = new Bitmap[ TotalNumOfFrames ];
int countFrame = 0;
while (countFrame < TotalNumOfFrames)
{
bitmapFrames[countFrame] = AVIReader.GetNextFrame();
countFrame++;
}
AVIReader.Close();
うっかりこのまま実行して、フレーム数の多い高解像度のAVIなぞ放り込むと、間違いなくメモリ不足で即死するので注意。
各メソッド、プロパティは以下の通り。

  • AVIReader(): コンストラクタ
    • void Open(string filename): filenameのAVIを開く
    • void Close(): AVIファイルを閉じる
    • Bitmap GetNextFrame(): 現在のフレームデータをBitmapで返し、Positionプロパティをインクリメントする
    • int Width: AVIの幅(ピクセル数)
    • int Height: AVIの高さ(ピクセル数)
    • float FrameRate: AVIのフレームレート(単位fps)
    • int Length: AVIの全フレーム数
    • int Position: 現在のフレームポインタ(

Lengthを超えてアクセスしようとするとぬるぽになる。
また見てのとおりOpen()、Close()やGetNextFrame()でコケてもエラーを吐かないので、ちゃんと例外処理をすること。

AVIファイルを作成して、Bitmapをフレームデータとして書き出す


Bitmap bitmapAVI = new Bitmap(stringBMPFilename);
AVIWriter AVIWriter = new AVIWriter();
AVIWriter.FrameRate = 60;
AVIWriter.Codec = "DIB ";
AVIWriter.Open(stringAVIFilename, bitmapAVI.Width, bitmapAVI.Height);
int countFrame = 0;
static int NumOfFrames = 1000;
while (countFrame < NumOfFrames)
{
AVIWriter.AddFrame(bitmapAVI);
countFrame++;
}
AVIWriter.Close();
こちらもうっかりこのまま実行して、あまりでかい画像を何フレームも書き込もうと、HDDを喰うので注意。
各メソッド、プロパティは以下の通り。

  • AVIWriter(): コンストラクタ
    • void Open(string filename, int width, int height): 幅width、高さheightのfilenameのAVIを作成する(開く)
    • void Close(): AVIファイルを閉じる
    • void AddFrame(Bitmap bitmap): 現在のフレームデータとしてbitmapを追加する
    • int FrameRate: AVIのフレームレート(単位fps)、AVIを開く前に設定
    • string Codec: AVIのCODEC種、"DIB "(最後のwhite spaceに注意)で非圧縮、AVIを開く前に設定

これも見てのとおりOpen()、Close()やAddFrame()でコケてもエラーを吐かないので、ちゃんと例外処理をすること。