Von FFMPEG konvertierte Videos haben eine andere Dauer. Warum?


9

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.


1
Ich würde denken, dass es von Ihren Eingabe- und Ausgabecodecs abhängt. Lange GOP-Codecs können die Dauer des Videostreams ändern, um Keyframes dort zu platzieren, wo sie benötigt werden, und GOPs zu schließen. Dieses Problem sollte bei der Transcodierung von Intra-Codecs zu Intra-Codecs nicht auftreten. Wenn Sie das Video nicht neu codieren müssen, verwenden Sie die Option 'c: v copy', wenn der Zielcontainer diesen Codec unterstützt.
Audionuma

Ich gehe davon aus, dass sich die Längenunterschiede bei längeren Videos nicht verschlechtern werden. Es ist eher ein Start / Ende-Problem, keine Geschwindigkeitsverschiebung oder so. Wenn ich Sachen mit ffmpeg xcodiere, bleiben die Anzahl der Frames, die Framerate und die Länge in Sekunden immer gleich. (es sei denn, ich möchte, dass es sich ändert!).
Peter Cordes

@audionuma: Kein vernünftiger Codec fügt Frames hinzu oder entfernt sie. Mencoder führt manchmal aufgrund einer / v-Synchronisierung VOR dem Einspeisen von Frames in den Videocodec aus. Ein Codec setzt Keyframes dort ein, wo er es für richtig hält (festes Intervall oder bei Szenenschnitten), und wenn der Encoder dem Codec mitteilt, dass dies der letzte Frame ist, schließt er den letzten GOP, wie lange er auch dauert. Selbst bei nicht adaptiver Keyframe-Platzierung fügt kein Codec zusätzliche Frames hinzu, um die letzte GOP auf die gleiche Länge zu bringen!
Peter Cordes

Antworten:


7

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 .flvDatei 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 .aviund .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:

    1. 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.

    2. 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.


Tatsächlich ist das Containerformat wahrscheinlich relevant. Verschiedene Container speichern Zeitstempel / Rahmendauern unterschiedlich. Und Längenrechner benötigen unterschiedlichen Code für unterschiedliche Containerformate, und dieser Code kann sich unterschiedlich verhalten. zB Zählen der Dauer, für die der letzte Frame in einem angezeigt wird, aber nicht in einem anderen.
Peter Cordes

@PeterCordes, was meinst du mit "Länge" in deinem Kommentar? Wenn Sie "Dauer" bedeuten wollten, dann liegen Sie falsch. Die Dauer ist immer die Anzahl der Frames mal der Zeitbasis. Wenn Sie etwas anderes meinen, geben Sie bitte an, was Sie unter "Länge" verstehen.
Avnr

Ich meinte Dauer. Nicht alle Videos haben eine konstante Bildrate. Und die Art und Weise, wie Frame-Dauern gespeichert werden (als Bruchteil oder was auch immer, normalerweise ein Vielfaches einer Zeitbasis), ist für verschiedene Container unterschiedlich. Das ist ein bisschen von Hand gewellt und meinerseits erfunden, da ich mir die Details nicht angesehen habe, aber ich bin mir ziemlich sicher, dass es nicht so einfach ist, wie wir es uns gewünscht haben.
Peter Cordes

@PeterCordes, okay, aber das ist so selten und gehört nicht wirklich hierher, es wird nur in einigen Randfällen wie Bildschirmaufzeichnung, Diashows usw. verwendet. Es gibt einen gewissen Missbrauch des Begriffs Variable Frame Rate in der Bearbeitungssoftware, aber die In ihrem Fall ist Hybridvideo ein prägnanterer Begriff (dh Streams mit unterschiedlichen Raten oder Zeitbasen, die ihre ursprünglichen konstanten Raten beibehalten, wenn sie zusammen gemuxt werden). Bei einem "normalen Film" ist fast immer eine Bildrate bekannt, unabhängig davon, wie der Container ihn in seinen Metadaten darstellt.
Avnr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.