動画の4秒あたりから10秒間をgifファイルに変換してみました。間隔を30msにしたものは動画と同じように見えますが、ファイルサイズも12MB超と大きいです(元の動画全体よりも大きい)。スマホのようにデータ通信量を気にしないといけない人もいるので別ページにしました。

GIFは、Graphics Interchange Format(グラフィックスインターチェンジ形式)の略語で、比較的単純な画像向けに設計されたファイル形式です。主にインターネットでの表示で使用されます。

自分でつくったゲームをプレイしているところを動画にするだけではなく、gifファイルにできないでしょうか? やっぱり同じ画像でも動きがあったほうがわかりやすいです。

FFmpegで動画から画像を抜き出す

まず動画から画像を抜き出すにはFFmpegを使います。FFmpegは無料で利用できます。以下のリンクからダウンロードできます。

Download FFmpeg

Windowsで使うならWindowsのロゴの上にマウスを置くと「Windows builds from gyan.dev」が表示されるので、これをクリックします。

リンク先のページにあるffmpeg-git-full.7zをクリックするとダウンロードできます。解凍したらbinフォルダのなかにあるffmpeg.exeとffprobe.exeを適当なところへコピーします。鳩でもわかるC# 管理人はCドライブにffmpegというフォルダを作成して、そこにコピーしました。

C# WindowsFormsで以下のようなものを作ります。

上のボタンでmp4ファイルを選択して下のボタンでgifファイルを生成します。label1には選択されているmp4ファイルのパス、label2には処理中か完了したことを示す文字列が表示されます。3つのNumericUpDownコントロールで画像を抜き出す開始時刻と終了時刻、抜き出す間隔を指定できるようにしています。

画像を抜き出す時間とファイル名の数字部分のペアをリストに格納するクラスを定義します。

第一引数はmp4ファイルのパス、第二引数は画像ファイルが出力されるフォルダのパス、第三引数は開始秒(単位は秒)、第四引数は終了秒(同前)、第五引数は間隔(単位はミリ秒)です。

あとはProcessクラスを使ってffmpeg.exeに引数を渡して実行するだけです。これで第二引数で指定されたフォルダのなかにmp4ファイルから抜き出した画像ファイル(PNG形式)が保存されます。そしてこのメソッドは保存されたファイルのパスの配列を返します。

抜き出した画像でgifファイルを生成する

この部分は以前とほとんど同じです。第二引数で渡された画像ファイルがあるかどうかのチェックが新たに追加されています。

以下はgifファイルを生成する元になるmp4ファイルを選択するダイアログを表示させる処理です。

gifファイルを保存するためのダイアログを表示させて、実際にmp4ファイルからgifファイルを生成する処理です。

mp4ファイルの開始秒から終了秒まで一定の間隔で画像が抜き出されて実行ファイルがあるフォルダに保存されます。そのあとSaveGifFileメソッドによってgifファイルが生成されます。開始秒や終了秒が適切に指定されていないと画像ファイルを抜き出すことができません。そのためSaveGifFileメソッド内でファイルが存在するかどうかのチェックがされています。

動画の4秒あたりから10秒間をgifファイルに変換してみました。間隔を30msにしたものは動画と同じように見えますが、ファイルサイズも12MB超と大きいです(元の動画全体よりも大きい)。スマホのようにデータ通信量を気にしないといけない人もいるので別ページにしました。