Zeitbasiert anstelle von Frame-basierten Zonen (mit unterschiedlicher CRF) für ffmpeg + x264 / x265-Codierung?

543
Peter Cordes

x264 / 5 verfügt über einen zonesParameter, der verschiedene Kodierungseinstellungen für einen Teil eines Videos unterstützt, er akzeptiert jedoch nur Bildnummern, keine Zeitstempel.

Dies ist bei Videos mit konstanter Bildrate eine geringfügige Unannehmlichkeit, aber bei der Verwendung eines ffmpeg-Filters, wie mpdecimate(fast) exakte, doppelte Frames, zu verwerfen. Oder allgemein mit VFR-Video. (Und wenn es nicht funktioniert ffmpeg, nur eine Option für die Stand-Alone-CLI, wäre das auch eine große Unannehmlichkeit.)


libx265 (und libx264) verfügen über eine API, die es dem Aufrufer ermöglicht, einige Encoderparameter im Handumdrehen neu zu konfigurieren. Die libx264- und libx265-Encoder-Wrapper von ffmpeg könnten theoretisch die CRF- oder andere Encoderparameter in einem bestimmten Bereich von Zeitstempeln separat von x264 einstellen. " Zonen "Funktion.

ffmpeg hat Start- / Stop-Bereiche für Filter. Daher enthält die Befehlszeilen- / Optionsanalyse wahrscheinlich den Großteil des Codes, der für die Verarbeitung dieses Befehls erforderlich ist.

Aber AFAIK ist dies derzeit nicht implementiert. ffmpeg -h encoder=libx265zeigt nichts relevantes; -x265-paramswird analysiert, um den Encoder einmalig beim Start zu konfigurieren, und es werden nur ein paar andere Optionen unterstützt. ( libx264hat viele weitere ffmpeg-Optionen, aber keine Zonen, die ich sehen kann.)


Gibt es einen alternativen Weg, um mit -vf mpdecimate(oder einer beliebigen VFR-Quelle) zu codieren und CRF30 für den Großteil des Videos zu haben, aber CRF = 24 von 00:30:00zum 00:30:30Beispiel?

In meinem Fall gibt es einen visuell interessanten Clip, der es wert ist, etwas mehr für die Qualität auszugeben, und ich möchte das Video lieber nicht abhacken und MKVs geordnete Kapitel verwenden, um dies zu ermöglichen. Wenn es dafür eine einfache ffmpegSyntax gibt (vor allem in einem Durchlauf), wäre das schön. Etwas, das in eine Bash-Shell "one liner" passt, ist das, was ich anstrebe.

Um dies mit Zonen zu tun, denke ich, ich muss das Video durchlaufen mpdecimateund die Bildnummern des Beginns / Endes dieses Zeitbereichs herausfinden. Ich denke, ich müsste das Video über die eigenständige x265CLI laufen lassen, da Zonen meiner Meinung nach eine Funktion des Befehlszeilen-Frontends und nicht der Bibliothek selbst sind. (Und somit nicht unterstützt -x265-params, um Schlüssel / Wert-Paare an libx265 zu übergeben).

Ich habe geprüft, ob Handbrake irgendeine Art von Zonen unterstützt, und ich sehe es nicht in der GUI. (Und das Handbrake 1.0.7-Paket von Arch Linux verwendet immer noch x265 2.1, daher gibt es nicht einmal die aktualisierten Lambda-Tabellen von x265 2.4, die vor mehr als 9 Monaten auf den Markt kamen.) Handbrake ist nett, außer dass private Codecs veraltet sind gegen die Systemversion zu bauen, was für x265 definitiv immer noch von Bedeutung ist.)

1
Mit x265-Parametern ** werden Zonen festgelegt. Gyan vor 6 Jahren 0
@ Mulvya: ok danke, damit kümmert sich CFR-Inhalte mit ffmpeg. Die Frage nach VFR-Inhalten bleibt jedoch bestehen. Zeit -> Frame-Nummer ist in diesem Fall kompliziert. Peter Cordes vor 6 Jahren 0
Sie benötigen zwei Pässe. Wenden Sie mpdecimate und dann showinfo an. Beachten Sie das "n" für die Start- / Endzeit pts_times. Dann im 2. Durchgang kodieren. Gyan vor 6 Jahren 1

0 Antworten auf die Frage