FFmpeg concat video-und audio out of sync
Verbinden mehrerer Dateien mit ffmpeg concat scheint es zu einem Missverhältnis des timestamps oder offsets für die audio. Ich habe versucht, mit mehreren videos und bemerkt das gleiche problem, bei h.264 /MP4.
Mit concat
und Codierung das video scheint gut zu funktionieren. Das audio bleibt synchron wie ffmpeg hat die vollständige Umwandlung Berechnungen und scheint immer alles richtig machen.
Jedoch, einfach in der Verknüpfung der videos, ohne transformation oder Codierung Ergebnisse in einer langsam steigenden sync-Problem. Natürlich, die Codierung des videos, anstatt sich einfach dazu gesellt sich in einem Verlust von Informationen/Qualität also ich würde lieber einen Weg finden, um dieses problem.
Habe ich versucht, mehrere flags zu Sortieren, das problem, dass angezeigt wird, werden basierend auf dem Zeitstempel. Keine von diesen scheinen, um das problem zu beheben obwohl.
ffmpeg -f concat -fflags +genpts -async 1 -i segments.txt test.mov
ffmpeg -auto_convert 1 -f concat -fflags +genpts -async 1 -i segments.txt -c copy test2.mov
ffmpeg -f concat -i segments.txt -c copy -fflags +genpts test3.mp4
ffmpeg -f concat -fflags +genpts -async 1 -i segments.txt -copyts test4.mov
ffmpeg -f concat -i segments.txt -copyts test5.mov
ffmpeg -f concat -i segments.txt -copyts -c copy test6.mov
ffmpeg -f concat -fflags +genpts -i segments.txt -copyts -c copy test7.mov
Hinweis: alle anderen Fragen, die ich finden konnte SO scheinen, zu "reparieren" das problem, indem Sie einfach die Codierung des videos wieder. Nicht eine gute Lösung.
Update
Erkannte ich die concat war nicht das problem. Der ursprüngliche Satz von clips, die Sie hatte, mis-matched Zeitstempel. Irgendwie concat + Codierung das Problem behoben wurde, aber ich will nicht zu re-encodieren des-videos und-lose Qualität jedes mal.
ffmpeg -y -ss 00:00:02.750 -i input.MOV -c copy -t 00:00:05.880 output.MOV
Führte im Ergebnis zu den folgenden Daten
ffprobe -v quiet -show_entries stream=start_time,duration output.MOV
start_time=-0.247500
duration=6.131125
start_time=-0.257333
duration=6.155333
Da habe ich dann versucht zu nutzen -to
m und -t
in verschiedenen Orten entlang mit -af apad -c:v copy
und ich habe noch immer nicht die Dauer das gleiche zu sein.
Hier ist die vollständige Ausgabe von ffprobe
Hier ist das original (rot) vs the segment (grün)
Detaillierte Sample-Dateien
Zeichnete ich ein Beispiel-video, Hinzugefügt die Befehle zu hacken, dann concat es. http://davidpennington.me/share/audio_sync_test_video.zip
- Kann Audio neu codiert, aber nicht video. Sie können
-video_track_timescale
zu ändern video-Zeitbasis von MOV/MP4s, ohne re-encoding. Wenn Sie fügen Sie details von input-Dateien, die hilfreich sein wird. - Ich denke, es könnte im Zusammenhang mit dieser ffmpeg-ticket für mp4/aac
- Dieser Kommentar über keyframes, könnte ein Teil des Problems mit dem audio-sync-Probleme.
- sboisse schlägt mit ffprobe zu finden ist die nächste keyframes, dann befestigen Sie an dieser Stelle.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser zwei-Schritt-Prozess funktionieren sollte
Schritt 1 Pad aus der audio-in jedem segment
Oder
Generieren Segmente mit synchronisierten streams
Schritt 2 Concat
wo
segments.txt
besteht aus den Namen der gepolsterte Dateien.-af apad -c:v copy <audio encoding params> -shortest
aber es immer noch nicht fix das video ist.apad
Vorschlag)-c copy
beide verursacht sync-Probleme. Ich bin mir nicht ganz sicher, wie viel out-of-sync werden die resultierenden Dateien wurden nach concat, aber es ist ziemlich Auffällig, nur ein paar Sekunden in dem video..009
offset-start-Zeit für den video-stream. Ich gepolsterten Film (gar nicht so viel ändern, wenn etwas aus dem Wellenlängenbereich) aber das video synchronisiert besser, auch nach 1 minute video und die gepolsterte video-Segmente hatten eine neue offset-so etwas wie0.042
. Ich denke, das problem ist der Spieler, der OS-Plattform und der Datei-Typen, die auch was in leicht unterschiedlichen Ausgaben.Ich habe zu kämpfen mit diesem seit geraumer Zeit als gut. Besonders beim arbeiten mit Panasonic AVCHD-erzeugten MTS-Dateien. Meine aktuelle Lösung ist zu verketten, die auf OS-Ebene nicht ffmpeg. Ich mache das auf windows und es sieht wie folgt aus:
Unter linux sollte so etwas wie:
Können Sie look-up-Dokumentation für die windows und linux binäre Verkettung.
Diese Methode der Verkettung als adaptiert, um die Transkodierung ist der Weg zu gehen, wenn das original-format wird für Sie arbeiten. Diese Methode praktisch verwendet keine CPU-Leistung und bewahrt die ursprüngliche Qualität. Eine win-win-Umgang mit Massen-Medien von hoher Qualität.
können Sie
filter_complex
zu concat verschiedenen Optionen in einem RutschStieß ich auf ein ähnliches problem und eine Lösung gefunden, die funktionierte, zumindest für mich. In meinem Fall, ich war auch verketten Dateien, und gefunden, audio - /video-sync-Probleme mit iOs, aber nicht mit Windows (z.B. VLC media player, zeigten sich keine Probleme bei der Synchronisierung mit der gleichen Datei mp4). Das symptom für iOs-spielen dieses verkettet mp4 war zunächst eine gute Synchronisation, gefolgt von einem zunehmenden Verlust der Synchronisation, da der Film gespielt, mit audio geht schneller, als video. Interessanterweise, ist die Synchronisierung wiederhergestellt werden konnte vorübergehend durch die Förderung der Film die Fortschritte Schieberegler an eine beliebige Stelle in dem Film, aber dann der sync verloren gehen würde wieder, wie der Film weiter zu spielen in iOs. Durch das spielen der gleiche Film gleichzeitig in beiden iOs und Windows VLC und anfangs miteinander synchronisiert, so gut ich konnte, durch die Beobachtung der Entwicklung der "echo" zwischen Ihnen, habe ich festgestellt, dass die iOs-audio-werde zu schnell (vorausgesetzt, der Windows player ist korrekt).
Für mich war die Lösung, fügen Sie die audio-filter-option
-af aresample=async=1000
zu der ffmpeg-Befehl, die fand ich als ein Beispiel in der ffmpeg-online-Dokumentation und wörtlich genommen. Ich weiß nicht, ob diese Einstellung ist optimal, aber das Ergebnis war ein mp4 mit audio-und video verbleibenden synchronisiert, wenn gespielt von beiden iOs und VLC. Das ffmpeg-option ergab die richtige iOs-Synchronisierung, sowohl während der Verkettung und danach beim re-encoding die schon verketteten Datei.Wenn die input-videos, die codiert wurden, mit den gleichen Einstellungen, die Sie möglicherweise in der Lage zu
mkvmerge
von mkvtoolnix statt:Brauchte ich zum verketten von videos aus verschiedenen Quellen, die verschlüsselt wurden, mit verschiedenen Einstellungen, so habe ich einen Befehl wie diesen, um die Größe und neu-codieren des Eingangs-videos erste:
for f in *.mp4;do width=1280;height=720;ffmpeg -i $f -filter:v "scale=iw*min($width/iw\,$height/ih):ih*min($width/iw\,$height/ih), pad=$width:$height:($width-iw*min($width/iw\,$height/ih))/2:($height-ih*min($width/iw\,$height/ih))/2" -c:v libx264 -crf 22 -preset slow -pix_fmt yuv420p -c:a libfdk_aac -vbr 3 -ac 2 -ar 44100 ${f%mp4}mkv;done
Einige der videos, die nicht über einen audio-Kanal, also musste ich einen Befehl wie diesen verwenden Sie zum hinzufügen eines silent-audio-Kanal zu Ihnen:
for f in *.mkv;do ffprobe $f|&grep -q '1: Audio'||{ ffmpeg -i $f -f lavfi -i anullsrc -c:a libfdk_aac -shortest -c:v copy temp-$f;mv temp-$f $f; };done
Ich dann verkettet die videos mit einem Befehl wie diesem: