仕事の備忘録

IT系技術とか、カスタマーサービスとか

ffmpegとC#を使って指定秒数の音声ファイルを作る 2.連続分割処理

前回の設計から、CSVファイルを読み込んたので、mp4ファイルを分割する。

testedquality-tech.hatenadiary.jp

 ffmpeg.exeをそのまま利用するため、DOSで呼び出すことが必要。実際にffmpeg.exeを使うと分かるがそれなりの処理時間と出力が伴う。コマンドラインとしては下記のようになる。

例:ffmpeg -ss [開始位置(秒数)] -i [元動画] -t [切り出す秒数] [新しい動画]

ffmpeg -ss 0 -i C:\Uni\SourceMovie\K_111.mp4 -t 120 C:\Uni\DestFile\K_111\output01.mp4

前回読み込んだdataListのデータをそのままループさせて、ffmpegを呼び出しmp4ファイルを指定秒数に切り分ける連続処理を実施する。

-----------------------------------------------------------------------------------------------------------

var dFolderPath; //分割ファイルを置くフォルダ

var sSplitMinFilename; //CSVファイルパス

var dataList = setCSV(sSplitMinFilename); //前回説明したファイル読み出し

               foreach (CSVData c in dataList)
                    {
                        //ffmpegを呼び出しmp4ファイルを指定秒数に切り分ける
                        var dFileName = dFolderPath + "\\" + c.Name + "_" + c.Id.ToString() + ".mp4"; //出力ファイル名
                        var arguments = string.Format("-ss {0} -i {1} -t {2} {3}", c.startsec.ToString(), f, c.vframessec.ToString(), dFileName);

                        var process = Process.Start(new ProcessStartInfo("ffmpeg.exe", arguments)
                        {
                            CreateNoWindow = true,
                            UseShellExecute = false,
                        });
                        process.WaitForExit();
                        //プロセスが終了したか確認する
                        if (process.HasExited)
                        {
                            WriteLine("処理正常終了:01動画切り出し:" + c.Name + ":" + c.Id.ToString()); //ログ画面にエラー出力
                        }
                        else
                        {
                            WriteLine("プロセスが終わってない!ファイル作れなかったかも!強制終了しとくね。" + c.Id.ToString() + ":" + c.Name ); //ログ画面にエラー出力
                            process.Kill(); //強制終了
                        }
                    }

-----------------------------------------------------------------------------------------------------------

実際にファイル分割が完了したら、音声ファイルにさらに変換する。分割と音声変換を連続して命令することも可能であったが、読み込んだCSVファイルの指定自体が間違っていた場合の再処理を考えて、一度mp4分割のみを完了させることにした。

音声に変換する場合には上の//ffmpegを呼び出しmp4ファイルを指定秒数に切り分ける と書いた部分について以下のように変更となる。ここでのポイント「pcm_s16le」は音声の劣化をさせないような変換となる。これはAPIでの文字起こしをする場合を考慮してできる限りよい状態を保持するようにするためである。

例:ffmpeg -i [元動画] -acodec pcm_s16le [取り出す音声]

ffmpeg - i C:\Uni\DestFile\K_111\output01.mp4 -acodec pcm_s16le C:\Uni\DestFile\K_111\output01.wav

-----------------------------------------------------------------------------------------------------------

//ffmpegを呼び出しmp4ファイルを音声ファイルwavに変換する
                        var dFileName = dFolderPath + "\\" + c.Name + "_" + c.Id.ToString() + ".mp4"; //変換ファイル名
                        var dwavFileName = dFolderPath + "\\" + c.Name + "_" + c.Id.ToString() + ".wav"; //出力ファイル名

                        var arguments = string.Format("-i {0} -acodec pcm_s16le {1}", dFileName, dwavFileName);

-----------------------------------------------------------------------------------------------------------

ちなみに、音声ファイル変換時エラーが発生する場合があった。これは単純に音声が記録されてなかったためであった。

ということでこんな感じでファイルが分割され、wavファイルも作成できたので文字起こしの準備が完了した。

同じファイル名で.jpgも作っている。指定秒数の先頭の画像を切り出してみた。

例:ffmpeg -ss [秒数] -i [動画] -vframes [フレーム数] -f image2 [出力ファイル名]

頭出しのサムネイルとして使うつもりだったが、Cognitive Servicesの別APIで使ってみることにした。