FFmpegは動画と音声を記録・変換・再生するためのフリーソフトウェアです。コマンドラインから使用することができますが、C#でこれを制御してみることにします。
ffmpegを使います。ここからダウンロードしてください。
Releases ・ BtbN/FFmpeg-Builds ・ GitHub
Zipファイルを解凍したらbinフォルダのなかにあるffmpeg.exeを実行ファイルがあるフォルダにコピーします。または任意の場所に保存してパスを通しておいてください。
動画の切り出し
これはDドライブにあるabc.mp4の5秒から10秒間を切り出してxyz.mp4という名前で保存するためのコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System; using System.Diagnostics; public class Program { static void Main() { Cutout(@"d:\abc.mp4", @"d:\xyz.mp4", 5, 10); Console.WriteLine("完了"); } static void Cutout(string orgPath, string outPath, int start, int len) { using (Process process = new Process()) { process.StartInfo.FileName = "ffmpeg"; process.StartInfo.Arguments = $@"-i {orgPath} -ss {start} -t {len} {outPath}"; process.Start(); // コマンド終了まで待機 process.WaitForExit(); } } } |
動画の結合
動画を結合するときは以下のようなテキストファイルを作成します。このときlist.txtと動画ファイルがあるフォルダは同じでなければなりません。絶対パスを指定するとUnsafe file name ‘パス’というエラーが出ます。このエラーの回避策は一応あるのですが、ここではすべて同じフォルダにある場合の解説のみをおこないます。
list.txt
1 2 |
file fileA.mp4 file fileB.mp4 |
d:\list.txtというテキストファイルを用意して結合処理を行なうのであれば以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; using System.Diagnostics; public class Program { static void Main() { Join(@"d:\list.txt", @"d:\xyz.mp4"); Console.WriteLine("完了"); } static void Join(string listPath, string outPath) { using (Process process = new Process()) { process.StartInfo.FileName = "ffmpeg"; process.StartInfo.Arguments = $@"-f concat -i {listPath} {outPath}"; // もしコーディックが同じなら // process.StartInfo.Arguments = $@"-f concat -i {listPath} -c copy {outPath}" のほうが処理が速い; process.Start(); process.WaitForExit(); } } } |