Deutlich höhere Leistung beim Verketten von Audio und Video
Wir haben kürzlich unsere Robots zum Verketten von Audio und Video aktualisiert. Sie nutzen jetzt FFmpegs concat-Demuxer, was die Leistung bei geeigneten Assemblies deutlich verbessert.
Damit Assemblies den neuen Demuxer nutzen können, müssen die Eingabedateien folgende Bedingungen erfüllen:
- Dasselbe Containerformat verwenden (z. B. ausschließlich MP4-Dateien).
- Dieselben Codecs für ihre Streams verwenden (z. B. H.264 für Video und AAC für Audio).
- Dieselben Codec-Parameter aufweisen (etwa Auflösung und Bildrate für Video oder Abtastrate für Audio).

Warum geht es deutlich schneller?
Das Verketten mit dem concat-Demuxer ist aus mehreren Gründen deutlich schneller als der Einsatz komplexer Filter und erneutes Transkodieren:
Kein erneutes Encoding erforderlich
Beim Einsatz des concat-Demuxers mit -c copy muss FFmpeg die Streams nicht erst
decodieren und dann erneut codieren. Erneutes Encoding ist CPU-intensiv und kann die Ausführungszeit
einer Assembly deutlich verlängern, besonders bei
Assemblies, die hochauflösende Videos verarbeiten. Indem der
concat-Demuxer diesen Schritt überspringt, vermeidet er unnötiges erneutes Encoding der Dateien und
schließt die Assembly deutlich schneller ab.
Direktes Kopieren der Daten
Der concat-Demuxer ermöglicht FFmpeg im Wesentlichen, die Mediendaten direkt aus den Quelldateien in die Ausgabedatei zu kopieren. Da nur minimale Verarbeitung nötig ist (abgesehen vom Auslesen der Dateiheader und dem Anpassen der Zeitstempel), wird der Vorgang hauptsächlich durch die Geschwindigkeit der Speichermedien begrenzt.
Qualität bleibt erhalten
Da kein erneutes Encoding stattfindet, gibt es auch keinen Qualitätsverlust durch Kompressionsartefakte, die beim Encoding entstehen könnten. Das ist ein zusätzlicher Vorteil neben der höheren Geschwindigkeit.
Im Gegensatz dazu muss FFmpeg beim Einsatz komplexer Filter oder bei erneutem Encoding alle Streams vollständig decodieren, verarbeiten (etwa durch Skalieren, Filtern oder andere Transformationen) und anschließend erneut in das Zielformat codieren. Das dauert länger und kann außerdem die Qualität verschlechtern und die Dateigröße erhöhen.
Dieser Ansatz ähnelt dem von LosslessCut, einem Open-Source-Videoeditor, den unser Transloadian Mikael Finstad entwickelt hat. Auch LosslessCut nutzt FFmpegs concat-Demuxer für schnelle, verlustfreie Videobearbeitung.
Um diese Änderung optimal zu nutzen, transkodieren Sie unterschiedliche Eingabedateien zunächst so,
dass Containerformat, Stream-Codecs und Codec-Parameter übereinstimmen, einschließlich Videoauflösung
und Bildrate sowie Audio-Abtastrate. Für die beste Leistung dabei verwenden Sie
turbo: true und eine unserer Voreinstellungen. Mit
beidem können Sie die Ausführungszeit Ihrer bestehenden
Assemblies deutlich verkürzen.
Wenn die Eingabedateien bereits alle oben genannten Bedingungen für übereinstimmende Container, Stream-Codecs und Codec-Parameter erfüllen, müssen Sie keine zusätzlichen Steps zum Encoding hinzufügen, da Sie die höhere Leistung bereits standardmäßig bemerken sollten. Falls Ihre Dateien jedoch unterschiedliche Container, Stream-Codecs oder Codec-Parameter (einschließlich Auflösung, Bildrate oder Abtastrate) aufweisen könnten, empfehlen wir, mit /file/filter einen Step hinzuzufügen, der abweichende Dateien an einen Step zum Encoding weitergibt. So können Sie das Beste aus Ihren späteren Steps zum Verketten herausholen.
