2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ffmpegのconcatで'Non-monotonous DTS in output stream'を出さないためにやったこと

Last updated at Posted at 2021-12-13

どうも、しののいと申します。
仕事で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初投稿なのでおっかなびっくり書いてます。
不勉強が過ぎるので、かなりあいまいな言葉を使ってますが、寛大な心でどうかご容赦ください。
内容に間違いや不備があれば教えていただけると助かります。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?