Das Aufteilen, Umcodieren und Zusammenfügen von Videodateien führt dazu, dass Sie auf Audio klicken

432
Faraz Ahmed

Wir möchten große Videodateien schneller verschlüsseln. Um die Kodierung zu beschleunigen, verwenden wir mehrere Kodierungsserver. Nachfolgend finden Sie unseren Kodierungsfluss

  1. Zuerst teilen wir das Video mit dem folgenden Befehl in kleine Segmente auf

    ffmpeg -i F:\video_data_set\4k_compressed.mp4 -f segment -segment_time 5 -segment_start_number 1 -codec copy -copyts -avoid_negative_ts 1 F:\video_data_set\test\%d_4k_compressed.mp4

  2. Dann teilen wir diese Segmente auf mehrere Codierungsserver auf. Jeder Codierungsserver codiert das Segment mit dem folgenden Befehl neu

    ffmpeg -hide_banner -i F:\video_data_set\test\1_4k_compressed.mp4 -c:a aac -ar 44100 -b:a 128k -c:v libx264 -x264opts nal-hrd=cbr:force-cfr=1 -pix_fmt yuv420p -profile:v baseline -level 3.0 -vf "scale=1280:-2,setdar=16:9" -b:v 3.9M -minrate 3.9M -maxrate 3.9M -bufsize 7.8M -preset ultrafast -crf 18 -r 30 -g 30 -threads 8 F:\video_data_set\test\1_4k_compressed_1.mp4

  3. Wenn alle Segmente neu codiert wurden, fügen wir sie mit dem folgenden Befehl zu einer einzelnen Datei zusammen

    ffmpeg -hide_banner -f concat -safe 0 -i F:\video_data_set\test\files_2.txt -c copy -threads 8 F:\video_data_set\4k_compressed_1.mp4

Alles läuft gut, aber das Problem, vor dem wir stehen, ist, dass nach jedem Segment ein Klick-Sound in der Audioausgabe zu hören ist.

Zum Beispiel habe ich 5 Segmente mit einer Dauer von 6,6,3,6 und 6 Sekunden codiert, wenn ich sie mit dem oben genannten Befehl verbunden habe. Das Ausgangsvideo hat einen Klick-Sound bei 6,12,15 und 21 Sekunden Video.

Können Sie mir bitte helfen und lassen Sie mich wissen, was die Ursache dieses Klickgeräusches ist und wie Sie dieses Klickgeräusch beheben und aus dem Ausgabevideo entfernen können.

1

1 Antwort auf die Frage

1
Eugen Rieck

Dies ist ein bekannter Effekt: Das -segmentVideo wird an einem gültigen Videoeinstiegspunkt (dh einem I-Frame), aber nicht immer an einem gültigen Audioeinstiegspunkt aufgeteilt.

Um dies zu umgehen, teilen Sie das Video und das Audio im ersten Schritt auf:

ffmpeg -i F:\video_data_set\4k_compressed.mp4 -f segment -segment_time 5 -segment_start_number 1 -c:v copy -an -copyts -avoid_negative_ts 1 F:\video_data_set\test\%d_4k_compressed.mp4 -vn -c:a aac -ar 44100 -b:a 128k F:\video_data_set\test\audio.m4a 

Fahren Sie dann mit den Videosegmenten wie in Ihrem aktuellen Workflow fort.

Für den letzten Schritt verwenden

ffmpeg -hide_banner -f concat -safe 0 -i F:\video_data_set\test\files_2.txt -i F:\video_data_set\test\audio.m4a -map 0:v -map 1:a -c copy -threads 8 F:\video_data_set\4k_compressed_1.mp4 

Um das Audio erneut hinzuzufügen.

Hallo Eugen, ich habe diese Lösung getestet, aber auf diese Art und Weise Audio nicht synchron. Ich denke, dass einige Frames auf diese Weise fallen, aufgrund derer das Audio nicht synchron ist. Bitte helfen Sie mir, dieses Problem zu lösen Faraz Ahmed vor 6 Jahren 0
Haben Sie die SETPTS- und ASETPTS-Filter ausprobiert, um die Audio-Synchronisierung zu erkennen? Eugen Rieck vor 6 Jahren 0
Nein, ich habe diese Filter nicht ausprobiert, wie ich diese Filter verwenden kann Faraz Ahmed vor 6 Jahren 0
Lesen Sie in der Dokumentation nach - der Punkt ist, dass der PTS für Video und Audio beim Aufteilen auf den gleichen Wert eingestellt wird, da sie möglicherweise einen Versatz haben, der beim Verschachteln nicht angezeigt wird. Eugen Rieck vor 6 Jahren 0
Hallo Eugen, können Sie mir bitte sagen, zu welchem ​​Splittungswert wir Audio- und Videopunkte einstellen müssen. Ich habe die Dokumentation gelesen. Audio-Videopunkte haben konstante Werte Faraz Ahmed vor 6 Jahren 0
Ich würde mit `setpts = PTS-STARTPTS` und` asetpts = N / SR / TB` beginnen, aber `Setpts = N / (25 * TB)` (für 25fps) könnte ebenfalls eine Idee sein. Eugen Rieck vor 6 Jahren 0