
皆さん、こんにちはこんばんは。
今回は一見簡単そうに見えて実は少しややこしいffmpegを使った拡張子が違う動画ファイルと音声ファイルを合成する方法を紹介します。
OS/ffmpegの情報
OS
1 2 |
Description: Ubuntu 22.04.2 LTS Release: 22.04 |
ffmpeg
1 |
ffmpeg version 4.4.2-0ubuntu0.22.04.1 |
どのような問題が発生するのか
拡張子の違う動画ファイル(映像と音声があるもの)と音声ファイルをそのまま合成させようとするとエラーのログは出力されないようなんですが、出力先のファイルに合成したかった音声ファイルが合成されずに出力されてしまうという現象です。
エラーログも出ないので問題を見つけるのが難しいです。
対策方法
今回私がとった手法はすでにある動画ファイルを一度映像と音声のファイルに分解をし、
一度音声ファイル同士で合成させた後に映像と音声を合成するやり方です。
さっそくやっていきましょう。
動画ファイルを一度分解する
まず初めに動画ファイルを映像ファイルと音声ファイルに分解していきます。
※今回はwebm形式に一度分解し、合成をします。
映像ファイルのみを出力
1 |
ffmpeg -i movie.mp4 -vcodec libvpx -an video.webm |
音声ファイルのみを出力
1 |
ffmpeg -i movie.mp4 -vn -acodec libopus audio.webm |
これで元々あった動画ファイルをそれぞれ映像ファイルと音声ファイルに分解ができました。
音声ファイルを合成する
次に、分解した音声ファイルと合成予定だった音声ファイルを合成します。
※合成予定の音声ファイルはwebm形式を想定します。
1 |
ffmpeg -i audio.webm -i audio_only.webm -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" audiomix.webm |
ここでポイントなのが、音声ファイルを合成するときにフィルターオプションで”amerge”を指定します。
フィルターオプションを使わずにそのまま合成してしまうと片方の音声のみとなってしまうので、注意が必要です。
映像と合成済み音声を合成する
最後に、先ほど分解した映像ファイルと分解後に合成した音声ファイルを合成させます。
1 |
ffmpeg -i video.webm -i audiomix.webm -vcodec h264 -acodec aac -r 30 -loop 1 output.mp4 |
今回は最終的にmp4として出力しますので、コーデックもそれに合わせています。
最後に
拡張子の違う動画ファイルと音声ファイルの合成についていかがでしたでしょうか。
意外と単純そうに見えて実は少し一手間加えないとしっかり合成ができないようです。
私もエラーログが発生しなかったので、解決に少し時間がかかりました…。
皆さんも是非試してみてください。