結論
ご唱和ください。
「FFmpegでトリミングした音声を映像と再結合する場合は再圧縮が必要」
経緯
動画編集アプリを作っています。
アプリはPythonで作成しており、動画の書き出しには、Moviepyを利用していましたが、最近FFmpeg+FFmpeg-pythonに変更しました。
FFmpegに変更したので動画のトリミング機能を追加しました。
アプリでの大まかな処理の流れは次のようなものになっています。
FFmpeg動画と音声を結合する時、codecをcopy(入力と一緒)と指示することで、動画の再圧縮せずに結合することができます。(一瞬で処理が終わる)
例えばffmpeg-pythonでは次のような記述になります。
stream=ffmpeg.output( input_audio, input_video.video,out_filename,movflags='faststart',acodec='copy', vcodec='copy',format='mp4').overwrite_output()
音声のトリミングは、ffmpeg-pythonでは次のように記述することで、トリミングができます。
input_audio=(
ffmpeg.input(audio_temp_filename)
.filter('atrim', start=start_time, end=end_time,)
.filter('asetpts', 'PTS-STARTPTS')
)
この時、input_audioは 非圧縮の状態です。※ここが大事
そのため、前述の結合のスクリプトに代入しても、音声のcodecがm4aなどMP4に合った形式となっていないため、音声の結合ができませんでした
(トリミングをした場合、無音の動画が出力されていた)
なので、トリミングが行われている場合には、codecを指定し、再圧縮することで、映像に音声を結合することができます。
全体の処理は下図のようになりました。
反省
手を抜かずにFFmpegのエラーを取得し見たらすぐにわかったのだろうと思います(近道しようとして、結局遠回りした)