ffmpeg-Verkettung erzeugt ein zu langes Ergebnis ohne Ton und teilweise mit falscher Geschwindigkeit

ffmpeg-Verkettung erzeugt ein zu langes Ergebnis ohne Ton und teilweise mit falscher Geschwindigkeit

Ich verwende ffmpeg 4.2.4.

Ich habe zwei kurze Videoausschnitte, die ich beide mit meinem Handy aufgenommen habe. Aus dem ersten habe ich einen Abschnitt ausgeschnitten (beginnend bei 18 Sekunden und auch 18 Sekunden lang – die Ausgabe scheint 18,02 Sekunden lang zu sein):

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

Und ich verwende den gesamten zweiten Teil, der 13,55 Sekunden lang ist:

cp VID_20201205_140804.mp4 2.mp4

Ich habe eine Datei concat.txt geschrieben:

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

Und habe den Concat-Filter verwendet, um sie zusammenzuführen:

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

Das resultierende Video hat keinen Ton und ist 3 Minuten und 2,35 Sekunden lang! Wenn ich es mir ansehe, sind die ersten 18 Sekunden richtig (allerdings ohne Ton), dann friert es ein und zeigt das letzte Bild des ersten Teils bis 1:47, an diesem Punkt beginnt die Wiedergabe des zweiten Teils, allerdings sehr langsam, bis zum Ende des Videos.

Irgendeine Idee, was ich falsch mache? Oder wie ich das debuggen könnte?

Hier sind die Informationen, die ffmpeg für die erste Eingabe druckt:

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

Der zweite Eingang:

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

Und die Ausgabe:

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

Antwort1

Alle Eingänge müssen dieselben Attribute haben. Ihre haben unterschiedliche H.264-Profile (Baseline vs. High) und Bildraten.

Sorgen Sie dafür, dass ein Video zum anderen passt:

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

„High Profile“ wird standardmäßig ausgewählt, Sie müssen es also nicht manuell hinzufügen. Wenn Sie jedoch „Baseline“ möchten, verwenden Sie -profile:v baseline.

Oder konvertieren Sie alle Videos in einen Kommentarsatz mit Attributen, unabhängig von den Eingabeattributen. SieheWie verkettet man Videos mit unterschiedlichen Attributen in ffmpeg?

verwandte Informationen