動画をOn the Flyで処理する

研究などで録画した映像の各フレームから、なんらかの情報を取り出したいという必要性に出くわすことがある。そんなときはどうしたらよいだろうか?


FFMpegという動画を変換するフリーのコマンドライン・プログラムがある。
最新のバイナリはここでゲットできるようだ。


このプログラムは動画のフレームを切り出すということができる。

そしたらこの出力先を標準出力に変えて、1秒ごとに映像を取り出し、それをC#で処理するということもできるだろう。

そのための、サンプルソース

// 切り出す位置(秒)
double sec = 5;
// 画像へのパス
string path = "sample.avi";

var process = new Process();
// ffmpegへのパス
process.StartInfo.FileName = "ffmpeg.exe";
// ffmpehへ渡す引数
process.StartInfo.Arguments = string.Format("-ss {0} -vframes 1 -i {1} -f image2 -", sec.ToString(), path);
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.Start();

this.picturebox.Image = Image.FromStream(process.StandardOutput.BaseStream);

ちなみにサンプルではaviを受け取っているが、FFMpegはいろいろな種類の形式を扱えるので便利。

このサンプルではPictureBox型のControlがあるとして、そこにffmpegから受け取った画像を表示するようにしている。


引数の説明はここが詳しい


受け取った画像は焼くなり煮るなりお好きなようにしてください。2値化とかは昔のエントリを参照