Handbrake Keyframes

samuelclemens

Lieutenant
Registriert
Nov. 2017
Beiträge
925
Ich möchte mit Losless Cut einige Videos etwas einschrumpfen mit H265 und dabei auch gleich den Keyframe Intervall von standardmäßig 10 sekunden auf 2 s reduzieren. Ich habe das in Handbrake unter "Zusätzliche Parameter" im "Video" Reiter so eingegeben:
keyint=2:min-keyint=1:scenecut=40
Scheint aber nicht zu funktionieren. Es bleibt bei den 10 Sekunden. Ne Idee was ich falsch mache?

Zwischenablage01.jpg
 
die parameter kann man mit nvenc wohl nicht verwenden:

Option Type H.264H.265Detail
gpu string GPU selection. Values: any (default), 0 (first GPU), 1 (second GPU), etc.
coder string Coder selection. Values: auto (default), cabac, cavlc.
temporal-aq boolean Set to 1 to enable Temporal Adaptive Quality, 0 to disable (default). Note the hyphen for H.264.
temporal_aq boolean Set to 1 to enable Temporal Adaptive Quality, 0 to disable (default). Note the underscore for H.265. Requires RTX Turing 1660 or better.
spatial-aq boolean Set to 1 to enable Spatial Adaptive Quality, 0 to disable (default). Note the hyphen for H.264.
spatial_aq boolean Set to 1 to enable Spatial Adaptive Quality, 0 to disable (default). Note the underscore for H.265.
aq-strength int When Spatial AQ is enabled, the values scale is 1 (low) – 15 (aggressive). Default: 8.
nonref_p boolean Set to 1 to enable automatic insertion of non-reference P-frames, 0 to disable (default).
strict_gop boolean Set to 1 to minimize GOP-to-GOP rate fluctuations, 0 to disable (default).
weighted_pred boolean Set to 1 to enable weighted prediction, 0 to disable (default).
rc-lookahead int Number of frames to look ahead for rate control. Default: 0.
b_adapt boolean When lookahead is enabled, set this to 1 to enable adaptive B-frame decision (default), 0 to disable.
no-scenecut boolean When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts, 0 to enable (default).

https://handbrake.fr/docs/en/1.9.0/technical/video-nvenc.html

musst wohl mit cpu statt gpu enkodieren, wenn dir die settings wichtig sind.
 
@0x8100 Hmm.. da hast wohl recht.

Aber über die CPU verdreifacht sich fast die rechen zeit.
Der zweck mit den Keyframes sollte das schneiden in Losless Cut etwas genauer ermöglichen.
Da kann ich sie gleich in Shotcut framegenau schneiden und neu codieren über die GPU.
Ist halt nur ne deftige fummelei... 😓

Ich möchte neben dem einschrumpfen ja auch hier und da was wegschneiden am Anfang oder Ende.
Mit Handbrake wär das in einem rutsch durch und ich hätt am ende nur jeweils sekunden zum wegschneiden gebraucht pro Datei. Leider liegt der Keyframe intervall bei fast allen Dateien bei 10 Sekunden. Zu viel um sinnvoll zu schneiden.
Das mach ich aber nur weil ich sie eh recodieren muss zum einschrumpfen.
 
Zuletzt bearbeitet:
LossLessCut einzusetzen wird etwas sinnig, wenn du verlustbehaftet den ganzen Spaß recodieren willst.
Das Intervall für die Keyframes herabzusetzen vergrößert die Videos, wobei es normalerweise für die Qualität nicht viel bringt. Moderne Encoder erkennen Scenenwechsel und erstellen entsprechend dynamisch Keyframes wenn es sein muss. Ja nach Bildinhalt kann das Erzwingen von vielen Keyframes bei der selben Datenrate sogar das Bild verschlechtern.

Dokumentation gibt es hier:
https://x265.readthedocs.io/en/master/cli.html

An deiner Stelle würde ich den Wert für "scenecut-bias" hoch setzen, wenn du bei Szenenwechseln Probleme hast und vielleicht mit "intra-refresh" experimentieren.
 
  • Gefällt mir
Reaktionen: samuelclemens und ghecko
Warum nicht einfach gleich den gewünschten Bereich in Handbrake eingeben?
HandBrake.webp
(CLI: --start-at und --stop-at)

samuelclemens schrieb:
keyint=2:min-keyint=1
Neben dem bereits gesagten: Bei x265 ist die Einheit dieser Parameter Einzelbilder, nicht Sekunden. Sprich, mindestens jedes zweite Einzelbild wäre dann ein Keyframe. Für einen Abstand zwischen Keyframes von maximal 2 Sekunden müsste die Zahl gleich 2x Bildwiederholrate sein (also z.B. keyint=60 für ein Video mit 30 FPS).

Edit: Wichtig für dein Vorhaben wäre auch noch no-open-gop=1, ansonsten können sich Inter-Frames auch auf Einzelbilder vor dem vorherigen Intra-Frame beziehen.
 
Zuletzt bearbeitet:
@SJAFNWEIF Ja bei den werten mit Keyint=2 hab ich mich vertan. Wären tatsächlich ca 60 Frames für 2 Sekunden.
Den Bereich gleich in Handbrake schneiden wäre in der tat interessant sofern es eine Möglichkeit gäbe entsprechende schnittmarker visuell zu setzen. So müsste ich die genauen werte jedoch bei jedem Video eh mit nem Editor erstmal mühsam ermitteln da sie nicht immer exakt gleich sind.
Aber selbst wenn die schnittmarke bei allen gelich wäre wüsste ich nciht wie man das allen dateien auf einmal im entsprechenden ordner zuweisen sollte. Be iallen anderen einstellungen scheint es zu gehen. Bei dieser jedoch nicht.
 
Zuletzt bearbeitet:
samuelclemens schrieb:
Auch Handbrake kann nicht außerhalb der Keyframes schneiden (korrigiert mich wenn ich irre).
Du irrst dich. ^^

samuelclemens schrieb:
Außerdem müsste ich die genauen werte bei jedem Video eh mit nem Editor erstmal mühsam ermitteln.
Musst du ja so oder so irgendwann? Und wenn es nicht ganz so genau sein muss, kann man den Bereich in Handbrake auch in Sekunden anstatt in Bildern angeben.
 
  • Gefällt mir
Reaktionen: Piktogramm
SJAFNWEIF schrieb:
Du irrst dich. ^^
Das hab ich bemerkt und sofort korrigiert. Da Handbrake ja eh neu codiert! 😓

Der Wert scheint aber eh nicht im Batchmodus für alle Dateien übernommen zu werden. Vermutlich weil der Endwert immer variiert.🤔
Vielleicht über die Zusatzparamater!?

Wie ich oben schon schrieb. Wenn ich eh nen richtigen Editor (Shotcut) bemühen muss kann ich das auch gleich dort manuell in eine Jobliste einpflegen und laufen lassen.
 
Zuletzt bearbeitet:
samuelclemens schrieb:
Da Handbrake ja eh neu codiert! 😓
Wenn du auf Zwang den Abstand von Keyframes neu erzwingst, läuft es sowieso auf Reencoding hinnaus. Wobei das etwas sinnlos ist, wenn das eingehende Video bereits verlustbehaftet kodiert ist. Denn die erzwungenen Keyframes sind dann ja auch nur aus den berechneten Bildern erzeugt.

Der Zaubertrick, mehr Keyframes ohne Reencoding geht nicht.
 
Mal ne kleine Frage nebenher.?
Ist es iwie möglich Handbrake beim encoden mit NVENC H.265 dazu zu bringen mehr aus der GPU rauszuholen?
Im Moment ist die GU (RTX 5070TI) maximal mit 40% ausgelastet und die CPU dafür mit fast 70% (anscheinend laut Taskmanager Handbrake.Worker für die 70% CPU verantwortlich).
Für eine Stunde Spielzeit benötigt es knapp über 10 minuten. Wär es machbar die GPU mehr auszulasten und dafür die zeit zu minimieren bei gleichen Qualitätseinstellungen?
 
Nach https://en.wikipedia.org/wiki/NVENC#Versions hat der GB203 zwei Encoder. Es könnte entsprechend möglich sein zwei Encodings auf der selben GPU laufen zu lassen. Die Videoströme lassen sich im Anschluss zusammenfassen.

Zusammenfassung würde dann so ausschauen
Code:
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "[0:v][0:a][1:v][1:a] concat=n=2:v=1:a=1 [v][a]" -map "[v]" -map "[a]" output.mp4

Zumindest unter Bash/Linux bzw. MacOS, irgend ein Windowsler möge sich erbarmen das evtl. anzupassen.
 
@Piktogramm Im Prinzip könnte ich aber auch eine zweite Handbrake Instanz auf den zweiten Encoder ansetzen und damit dann parallel zwei videos gleichzeitig encoden?
Wäre das nicht sicherer? Aber kein Plan wie umsetzen!?
Einfach zwei Instanzen mir zwei videos aufmachen und encoden läuft nicht da dann anscheinend beide plötzlich nur noch max 20% Auslastung haben.

Ist aber wie gesagt nur so ne Nebensache. Die Encodierzeiten sind schon so wesentlich besser als mit der alten 1060.
 
Wenn du zwei Videos hast, die als zwei Videos verbleiben sollen. Dann kannst du die Encodings entsprechend getrennt abwickeln. Vorausgesetzt Handbrake kann irgendwie die zwei Encoder getrennt ansprechen ob/wie das geht.. keine Ahnung.

Ich hatte es so verstanden, dass du ein Video schneller rendern willst. Da wäre Zweiteilen, Encodieren und nachfolgendes Zusammensetzen halt eine Option.
 
  • Gefällt mir
Reaktionen: samuelclemens
Piktogramm schrieb:
Ich hatte es so verstanden, dass du ein Video schneller rendern willst. Da wäre Zweiteilen, Encodieren und nachfolgendes Zusammensetzen halt eine Option.
Das wäre natürlich unkomplizierter vom handlich her falls man das automatisieren kann. Das zweiteilen stelle ich mir aber fehleranfälliger vor.
 
Zurück
Oben