Ich konvertiere Videos mit FFMPEG. Mein Ziel ist es, sie mit AAC- codiertem Audiostream und MPEG-4 Part 10 -codiertem Videostream in das MP4-Containerformat ( MPEG-4 Part 14 ) zu konvertieren .
Ich benutze die folgende Zeile, um die Videos zu konvertieren:
ffmpeg -y -i "{inputFile}" "{outputFile}"
Das konvertierte Video sieht gut aus, jedoch stimmt die Dauer der Streams in der konvertierten Datei und der Eingabedatei nicht immer überein.
Ich habe einige Experimente gemacht und der Unterschied in der Dauer ist zweifellos da, aber es ist nicht so viel - trotzdem teste ich mit kleinen Videos. Hier sind meine Ergebnisse:
| InputFile | InputAudio | InputVideo | OutputAudio | OutputVideo |
|------------|------------|------------|-------------|--------------|
| h.avi | 3s 631ms | 3s 567ms | 3s 668ms | 3s 567ms |
| h.flv | 3s 631ms | 3s 558ms | 3s 668ms | 3s 567ms |
| h.mov | 3s 532ms | 3s 533ms | 3s 682ms | 3s 534ms |
| h.mp4 | 3s 605ms | 3s 534ms | 3s 682ms | 3s 567ms |
| h.mpg | 3s 605ms | 3s 533ms | 3s 563ms | 3s 534ms |
| h.wmv | 3s 620ms | 3s 633ms | 3s 659ms | 3s 567ms |
Da ich eine Software auf FFMPEG aufbauen würde, wäre ich glücklicher, wenn ich zumindest den Grund für diesen Unterschied verstehen könnte. Liegt es an einer unnötigen Transcodierung?
Kann ich in diesem Fall diese Transcodierung deaktivieren, um zu verhindern, dass FFMPEG meine Eingabevideodatei erneut abtastet?
Wenn ich es nicht ausschalten kann, wie kann ich (neben dem Testen) sicher sein, dass dieser Unterschied nicht proportional zur Größe des Videos ist?
Wenn ich zum Beispiel ein 10-Stunden-Video konvertiere, ist eine Differenz von mehreren Sekunden oder sogar Minuten für mich nicht geeignet.
quelle
Antworten:
Hoffe, diese Erklärung ist das, wonach Sie suchen:
Wenn Sie in eine Codierung wie H.264 (MPEG-4 Teil 10) umcodieren, müssen Sie das Video auch neu abtasten. Dies ist Teil der H.264-Komprimierungstechnik. Ich bezweifle jedoch, dass dies der Grund ist, warum Sie eine Zeitlücke haben, da das Resampling nicht unbedingt die Taktrate der Medien beeinflusst. Ich würde mir also keine Sorgen um das Resampling machen, es kann zu Abweichungen führen, ist aber wahrscheinlich sehr marginal.
Die von Ihnen aufgelisteten Containerformate sind irgendwie irrelevant, da sie definieren, wie der komprimierte Stream gepackt wird, während die Quelle des Zeitunterschieds die Komprimierung selbst ist. Die
.flv
Datei kann beispielsweise einen Stream enthalten, der vom alten Flash Sorenson-Codec oder dem neueren H.264 codiert wurde. Im ersten Fall würden Sie den Videostream transkodieren, im letzteren Fall ist dies jedoch möglicherweise nicht der Fall - abhängig vom verwendeten Audio-Codec. Die.avi
und.wmv
-Container sind Codec-unabhängig, sodass die Codierung ihres Inhalts nicht einmal erraten werden kann.Sie haben nicht erwähnt, wie die Dauer getestet wurde. Beachten Sie, dass ffmpeg standardmäßig die Dauer anzeigt, die in den Metadaten der Datei angezeigt wird, und keinen berechneten Wert. Wenn Ihre Liste auf den Daten basiert, die ffmpeg als Teil seiner Begrüßungshinweise ausgibt, sollten Sie beachten, dass dies explizit Metadaten und kein tatsächlicher Messwert sind.
Das Delta in der von Ihnen angegebenen Dauer liegt im Bereich von einem oder zwei Frames in einem Bereich von 25 oder 30 fps. Es ist sinnvoll, dass Codecs leere Frames entsprechend ihrem Algorithmus (oder der Ordnung des Entwicklers ...) mit Streams auffüllen oder daraus entfernen. Es sollte die Zeitstempelung nicht beeinflussen, wenn Sie Streams ordnungsgemäß verketten.
Ich kann mir nur zwei Gründe vorstellen, die die Dauer Ihrer Medien erheblich verändern können und die in Ihrem speziellen Fall nicht zutreffen:
Neucodierung mit einer anderen Zielgeschwindigkeit. Manchmal geschieht dies unbeabsichtigt aufgrund fehlerhafter Metadaten in der Eingabedatei. Aber nicht in Ihrem Fall, der, wie oben erwähnt, einem einzelnen Frame entspricht, der fallen gelassen oder gewonnen wurde.
Wenn Sie einen Codec anwenden, der einen der beiden Streams neu erstellt. Beispiele hierfür sind das Entfernen von Werbung, die Erkennung von Stille, die Geräuschreinigung usw.
Fazit: Wenn Sie sich Sorgen machen, was mit einem 10-stündigen Video passieren wird, führen Sie einfach einen tatsächlichen Test durch. Wenn Sie auf Probleme stoßen und Hilfe suchen, müssen Sie die Codec-Details der Eingabedatei und die Methode, mit der Sie die Stream-Dauer gemessen haben, veröffentlichen.
Hoffe das hilft.
quelle