ffmpeg の連結により、音声が出ず速度が部分的に間違った、長すぎる結果が生成される

ffmpeg の連結により、音声が出ず速度が部分的に間違った、長すぎる結果が生成される

ffmpeg 4.2.4を使用しています。

携帯電話で撮影した短いビデオが 2 つあります。最初のビデオの一部を切り取りました (18 秒目から始まり、長さも 18 秒です。出力は 18.02 秒のようです)。

ffmpeg -i VID_20201205_135951.mp4 -ss 00:18 -t 00:18 1.mp4

そして、13.55 秒の長さの 2 番目の動画全体を使用します。

cp VID_20201205_140804.mp4 2.mp4

concat.txt というファイルを作成しました:

file '1.mp4'
file '2.mp4'

そして、concat フィルターを使用してそれらを結合しました。

ffmpeg -f concat -i concat.txt -c copy 12.mp4

結果として得られたビデオには音声がなく、長さは 3 分 2.35 秒です。これを見ると、最初の 18 秒は正しいのですが (音声はありませんが)、その後、1:47 まで最初の部分の最後のフレームが表示されたままフリーズし、その時点で 2 番目の部分の再生が始まりますが、非常にゆっくりとビデオの最後まで再生されます。

何が間違っているのか分かりますか? または、これをデバッグするにはどうすればいいでしょうか?

ffmpeg が最初の入力に対して出力する情報は次のとおりです。

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:18.02, start: 0.000000, bitrate: 17735 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 3840x2160 [SAR 1:1 DAR 16:9], 17678 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 69 kb/s (default)
    Metadata:
      handler_name    : SoundHandle

2番目の入力:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2020-12-05T14:08:20.000000Z
    com.android.version: 11
  Duration: 00:00:13.55, start: 0.000000, bitrate: 40373 kb/s
    Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuvj420p(pc, smpte170m), 3840x2160, 42298 kb/s, SAR 1:1 DAR 16:9, 30.02 fps, 30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 180
      creation_time   : 2020-12-05T14:08:20.000000Z
      handler_name    : VideoHandle
    Side data:
      displaymatrix: rotation of -180.00 degrees
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 96 kb/s (default)
    Metadata:
      creation_time   : 2020-12-05T14:08:20.000000Z
      handler_name    : SoundHandle

出力は次のようになります。

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '12.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:03:02.35, start: 0.000000, bitrate: 4734 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 3840x2160 [SAR 1:1 DAR 16:9], 4719 kb/s, 5.07 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 80 kb/s (default)
    Metadata:
      handler_name    : SoundHandle

答え1

すべての入力は同じ属性を持つ必要があります。H.264 プロファイル (ベースラインと高) とフレーム レートが異なります。

1 つのビデオを他のビデオと一致させます。

ffmpeg -i 2.mp4 -c:v libx264 -r 30 -c:a copy 2b.mp4

デフォルトではハイ プロファイルが選択されるため、手動で追加する必要はありませんが、代わりにベースラインが必要な場合は を使用します-profile:v baseline

または、入力属性に関係なく、すべてのビデオをコメント属性セットに変換します。ffmpeg で異なる属性を持つビデオを連結するにはどうすればよいですか?

関連情報