どうも、しののいと申します。
仕事でffmpegを使う機会が多いのですが、わけのわからんエラーに悩まされることがしょっちゅうです。
そんなエラーのひとつ、Non-monotonous DTS in output stream
がやっと納得のいくかたちで解決したので、備忘録も兼ねて共有します。
どなたかの役に立てば幸いです。
以前までの解決方法
これまでは素材を一度すべてMTSに変換し、それをconcat
で結合、そして再度もとの形式に変換するということをやっていました。
この方法だとエンコードの回数が増えるのでその分ロスが生まれますし、当然時間もかかります。
今回の解決方法
エラーが起きた状況
Premiere proで制作した動画と、ffmpegで生成した動画を連結しようとしたところ、上記のエラーが出ました。
時間をかけて色々試した結果、いくつかのパラメータを統一したらきちんと動画が結合されるようになりました。
統一したパラメータ
- ビデオのfps
- ビデオのタイムスケール
- オーディオのチャンネル数
- オーディオのサンプリングレート
動画のコーデックはh264、オーディオはaacでmp4形式、サイズはFHDで統一しました。
ビデオとオーディオのビットレートもなるべく近い数値になるようにしましたが、すべての素材で完全に一致しているわけではありません。
動くのでとりあえずよしとしましたが、この辺りはもう少し勉強した方がいいですね。
1. ffmpegで生成した動画のパラメータの確認
ffprobe -i ffmpeg.mp4
で動画の詳細を確認します。
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ffmpeg.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.76.100
Duration: 00:00:11.27, start: 0.000000, bitrate: 606 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuvj420p(pc, gbr/unknown/unknown), 1920x1080 [SAR 1:1 DAR 16:9], 539 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 58 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
出力結果はこんな感じです。
今回はこの動画に合わせてパラメータを設定します。
- ビデオのfps = 30
- ビデオのタイムスケール = 15360
- オーディオのチャンネル数 = 1 (mono)
- オーディオのサンプリングレート = 44100
2. Premiereで作った動画のパラメータを変更
ffmpeg -y -i premiere.mp4 -c:v h264_nvenc -video_track_timescale 15360 -b:v 1000k -r 30 -pass 1 -an -f mp4 NUL
ffmpeg -i premiere.mp4 -c:v h264_nvenc -video_track_timescale 15360 -b:v 1000k -r 30 -pass 2 -c:a aac -ac 1 -ar 44100 -b:a 64k output
上を実行してパラメータを調整します。
使ったコマンドの説明をちょこっと。
-video_track_timescale
で動画のタイムスケールを変更
-r
で出力のフレームレートを30に変更
-ac
でオーディオのチャンネルをモノラルに変更
-ar
でオーディオのサンプリングレートを変更
-b:v
と-b:a
で動画とオーディオのビットレートを一応近い数値に調整してます。
ここで-c copy
とすると、パラメータの調整にエンコードが必要な場合、エンコードがスキップされてしまいます。
3. 連結
ffmpeg -safe 0 -f concat -i input.txt -c copy output
これで連結して完了です。
おわりに
Non-monotonous
は解決しましたが、連結した結果かなり音ズレしていました。
ffmpegで作った動画のオーディオストリームとビデオストリームのdurationにズレがあるのが原因でした。
これも解決したので、また別の記事で紹介できればと思います。
Qiita初投稿なのでおっかなびっくり書いてます。
不勉強が過ぎるので、かなりあいまいな言葉を使ってますが、寛大な心でどうかご容赦ください。
内容に間違いや不備があれば教えていただけると助かります。