ffmpeg führt 60 fps und 30 fps mp4 in einer Datei zusammen

Ich habe erfolglos versucht, einige MP4-Dateien mit unterschiedlichen Bildraten zusammenzuführen. Wenn ich die Dateien zusammenführe, scheint es immer ein Problem mit der Ausgabe zu geben. Meistens ist der Ton nicht mit dem Video synchron. Ich habe versucht, die Bildrate der Videos zu ändern (30 zu 60 oder 60 zu 30), aber die Qualität wird dadurch zu stark reduziert.

Um die Dateien zusammenzuführen, habe ich alle Lösungen in diesem Beitrag verwendet

beim Ausprobieren dieser Methode:

:: Create File List
   echo file file1.mp4 >  mylist.txt 
   echo file file2.mp4 >> mylist.txt
   echo file file3.mp4 >> mylist.txt
:: Concatenate Files
   ffmpeg -f concat -i mylist.txt -c copy output.mp4

Audio und Video sind nicht mehr synchron und das Video friert manchmal ein.

Wenn Sie "mp4 zu mpg und dann zusammenführen" versuchen:

 ffmpeg -i 1.mp4 -qscale 0 1.mpg
 ffmpeg -i 2.mp4 -qscale 0 2.mpg
 cat 1.mpg 2.mpg | ffmpeg -f mpeg -i - -qscale 0 -vcodec mpeg4 output.mp4

Ich verliere das Audio in den 60-FPS-Dateien, zu diesem Zeitpunkt dachte ich, es sei ein Audioproblem, also habe ich versucht, den Audio-Codec aller mp4-Dateien wie folgt zu "vereinheitlichen":

ffmpeg -i input.mp4 -acodec SOME_AUDIO_TYPE -vcodec copy out.mp4

Die Zusammenführung erfolgt ohne Fehler, aber der Ton ist immer noch nicht synchronisiert

Also habe ich bei meinem letzten Versuch versucht, die fps-Rate meiner Dateien wie folgt zu ändern:

ffmpeg -y -i source.mp4 -r FPS -s RESOLUTION -c:v libx264 -b:v 3M -strict -2 -movflags faststart destination.mp4

Aber das Ergebnis mindert die Qualität zu sehr.

Es gibt die ffprobe der beiden Dateien:

libavutil      55. 57.100 / 55. 57.100
libavcodec     57. 88.100 / 57. 88.100
libavformat    57. 70.100 / 57. 70.100
libavdevice    57.  5.100 / 57.  5.100
libavfilter     6. 81.100 /  6. 81.100
libswscale      4.  5.100 /  4.  5.100
libswresample   2.  6.100 /  2.  6.100
libpostproc    54.  4.100 / 54.  4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
Metadata:
  major_brand     : isom
  minor_version   : 512
  compatible_brands: isomiso2avc1mp41
  encoder         : Lavf57.63.100
Duration: 00:00:32.00, start: 0.000000, bitrate: 3120 kb/s
  Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/iec61966-2-1), 1280x720, 2981 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default)
  Metadata:
    handler_name    : VideoHandler
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
  Metadata:
    handler_name    : SoundHandler



libavutil      55. 57.100 / 55. 57.100
libavcodec     57. 88.100 / 57. 88.100
libavformat    57. 70.100 / 57. 70.100
libavdevice    57.  5.100 / 57.  5.100
libavfilter     6. 81.100 /  6. 81.100
libswscale      4.  5.100 /  4.  5.100
libswresample   2.  6.100 /  2.  6.100
libpostproc    54.  4.100 / 54.  4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
Metadata:
  major_brand     : isom
  minor_version   : 512
  compatible_brands: isomiso2avc1mp41
 encoder         : Lavf57.63.100
Duration: 00:00:23.01, start: 0.000000, bitrate: 2585 kb/s
  Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720, 2412 kb/s, 60 fps, 60 tbr, 15360 tbn, 120 tbc (default)
  Metadata:
    handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 159 kb/s (default)
  Metadata:
    handler_name    : SoundHandler

Wenn ich die 2 Dateien mit der ersten Methode zusammenführe, bekomme ich Folgendes:

[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872466, current: 843279; changing to 2872467. This may result in incorrect timestamps in the output file.
[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872467, current: 843535; changing to 2872468. This may result in incorrect timestamps in the output file.
[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872468, current: 843791; changing to 2872469. This may result in incorrect timestamps in the output file.
[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872469, current: 844047; changing to 2872470. This may result in incorrect timestamps in the output file.
frame= 2340 fps=0.0 q=-1.0 Lsize=   19428kB time=00:00:50.53 bitrate=3149.8kbits/s speed=58.7x    
video:18420kB audio:949kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.304418%

Gibt es eine Lösung für dieses Problem?

Wie fügst du die Dateien zusammen? Wie rechnest du die Framerates um? Bitte geben Sie die vollständige ffmpeg-Befehlszeile und die Konsolenausgabe an (falls Sie diese verwenden).
Zunächst einmal vielen Dank, dass Sie versucht haben, mir bei der Lösung dieses Problems zu helfen. Ich habe meine Frage wie von Ihnen empfohlen bearbeitet und die meisten Schritte, die ich versucht habe, eingefügt. Ich hoffe, dies hilft Ihnen, die möglichen Fehler herauszufinden, die ich mache.
Zeigen Sie die vollständige Konsolenausgabe von:ffmpeg -i file1.mp4 -i file2.mp3 -i file3.mp4

Antworten (2)

Das Audio muss mit derselben Abtastrate neu codiert werden, wenn es in den Dateien unterschiedlich ist. Das Video muss nicht neu kodiert werden, aber es muss die gleiche Zeitskala haben.

ffmpeg -i input.mp4 -c:a aac -ar 48000 -ac 2 -c:v copy -video_track_timescale 600 out.mp4

Wenn das Audio einer Datei bereits 48-kHz-Stereo-AAC-LC ist, können Sie die Audiocodierung überspringen und einfach verwenden-c:a copy

Führen Sie concat mit den verarbeiteten Dateien aus.

Beim Anwenden dieser Änderungen auf eine Datei (44 kHz) werden die ersten Sekunden beschädigt. Ich habe immer noch versucht, die Dateien zusammenzuführen und VLC stürzt ab, wenn das beschädigte Video beginnt. Vor und nach dem Befehl befindet sich die ffprobe der Datei: pastebin.com/TPYt7NVf . Der Anfang ist negativ, ich weiß nicht wirklich, was es bedeutet, aber es könnte ein Hinweis sein
Ihr ffprobe zeigt hier ein MainProfil für Videos. Die Pastebin-Sonde zeigt Hoch an. Hast du die Videos neu kodiert?
Entschuldigung, ich habe viele mp4-Dateien, die ich kombinieren muss. Ich hätte möglicherweise andere verwendet, weil ich davon ausgegangen bin, dass die einzigen "Variablen", auf die es ankommt, Audio und Bildrate sind. Was gibt es über das "Haupt" oder "Hoch", das ein Problem verursacht? weil ich dieses vielleicht habe, während ich andere Videos zusammenführe.
Sie können eine unterschiedliche Anzahl von Bezugsrahmen haben.
Erklärt dies wirklich, warum das Video beschädigt wird, wenn der Audio-Codec und die Zeitskala geändert werden?
Das Video wird nicht durch Ändern der Zeitskala oder durch den Audio-Codec beschädigt. Wenn die angehängten Videostreams nicht die gleichen Bitstream-Parameter haben, erzeugt der Player normalerweise eine beschädigte Ausgabe. Die Zeitskala kümmert sich nur darum, die Geschwindigkeit der Visuals beizubehalten.
So sehen die ersten Sekunden des Videos "out.mp4" gyazo.com/f596143d2a638242d3285dbb09ad8d72 aus
Ich denke, es gibt ein Problem mit meinen Dateien, wenn ich so etwas mache ffmpeg -i 1.mp4 -c:v copy output.mp4(nur um die Datei zu überprüfen), ist die Ausgabe beschädigt (gleiche Ausgabe wie der Gyazo). Ich vermute, es ist ein Fehler in den Dateien? Ich lade sie einfach von twitch.tv herunter, was meiner Meinung nach eine zuverlässige Quelle ist

Verwandeln Sie im aktuellen Ordner alle mp4-Dateien in TS. Verwenden Sie dann den Windows-Befehl „Kopieren“, um jeden TS zusammenzuführen. Wenn Sie dann ein einzelnes ts haben, transmuxen Sie ohne Neucodierung in mp4.

for %i in (*.mp4) do ffmpeg -i "%i" -c copy -bsf:v h264_mp4toannexb "%~ni.ts" 
copy /b *.ts all.ts
ffmpeg -i all.ts -c copy all.mp4