Wenn jetzt allerdings beides letztlich gleichwertig sein soll, dann muss bei höherer Geschwindigkeit was anderes leiden, wenn die Qualität nahezu gleich ist.
Korrekt.
Ist es die/der Dateigröße/Komprimierungsgrad? Und du definierst Effizienz aber schon als Qualität/Dateigröße?
Moderne Videocodecs arbeiten mit einem "Qualitätsrating" um die nötige Bitrate zu bestimmen. Früher hat man eine konstante Bitrate eingestellt - das Ergebnis war größenmäßig vorhersehbar aber die Videos waren schlecht komprimiert - ruhige Szenen waren hübsch, bewegte Szenen hässlich. Danach kam averagebitrate und 2pass - im ersten Schritt schaun für welche Szenen man viel Bitrate braucht und wo weniger und dann entsprechend komprimieren. Besser aber noch immer nicht optimal.
Heite nutzen Codecs den CRF (ConstantRateFactor) und bestimmen während des Komprimiervorgangs durch geschickte Algorithmen, wie viel Bitrate nötig ist, um ein gewünschtes Bildqualitätslevel zu halten. Du sagst beispielsweise dem Encoder "CRF=20" und er wird die Bitrate in jeder Sekunde so wählen dass das Ergebnis sehr ansehnlich ist. Sagst du "CRF=25" wirds weniger hübsch, dafür die Datei kleiner. Blöderweise weiß man hier im Vorraus nicht mehr wie groß die Zieldatei wird - ein Actionfilm wird bei CRF 20 viel größer werden als eine Dokumentation mit CRF 20.
Nun kommt die Effektivität ins Spiel. Ein heutiger Encoder hat Hunderte von Funktionen und mathematischen Tricks, um die Bildqualität möglichst effizient in eine Datei zu packen (hier gibts ne Liste der Einstellungen:
Command Line Options — x265 documentation). Je mehr man davon verwendet und je stärker man die einstellt desto rechenaufwendiger wird der komprimiervorgang und desto effektiver wird die Komprimierung. Wenn ich den CRF bei 20 lasse und sehr aufwendige Einstellungen wähle wird die Datei entsprechend deutlich kleiner als wenn ich sehr lasche Einstellungen wähle - das Ergebnis ist qualitativ dasselbe (CRF ist ja immer 20), nur ist einmal die Datei viel kleiner und die benötigte Rechenzeit viel höher. Die Codecs lassen dir also die Wahl ob du schnell sein willst oder ob du effizient sein willst im Komprimierungsgrad ohne dass die Qualität beeinflusst wird.
Und genau hier setzen die GPU-Encoder an. Die leute haben in der Mehrzahl absolut keine Ahnung von dem was ich da grade erklärt habe und sehen nur die fps-Anzeige. Also stellt man beim GPU-Encoding die Einstellungen sehr sehr simpel ein. Bedeutet die Zieldatei wird sehr groß aber man kann extrem schnell komprimieren - und letzteres ist eben entsprechend werbewirksam.
Es hat auch technische Gründe warum man das so machen muss - denn GPUs sind im gegensatz zu CPUs nicht dazu geeignet, sehr komplexe Rechenoperationen durchzuführen. GPUs können nur vergleichsweise einfache Dinge tun, diese aber extrem parallelisiert und schnell mit ihren tausenden von Shadereinheiten. Deswegen wäre es sehr ineffektiv, die mathematisch "hochwertigen" Funktionen eines modernen Encoders auf einer GPU auszuführen, sie würde wegen der Komplexität der Berechnungen sehr, sehr langsam werden. CPUs sind für sowas gebaut, die haben mit Komplexität kein Problem, sind aber weniger effizient wenns sehr simpel wird (deswegen ist eine GPU bei "billigen" Einstellungen schneller als eine CPU).
Deswegen ists so, dass man ein Video das eine GPU komprimiert hat mit guten Einstellungen auf deiner CPU in aller Regel problemlos auf die Hälfte bis ein Drittel der Dateigröße runterbrechen kann ohne sichtbaren Qualitätsverlust (also mit gleichem CRF), nur ist das viel langsamer (ich hatte das für einen User hier mal mit einem seiner Minecraft-Clips gemacht der das nicht glauben wollte - seine Datei von ein paar Hundert MB aus Shadowplay hatte danach noch iirc ~60 MB und sah gleich aus
).
Wenn ich dagegen die billigen Einstellungen auch auf der CPU wähle ist meine TitanX nicht mehr nennenswert schneller als der 5960X.
Die Unterschiede steigen mit abnehmender Bitrate bzw. zunehmender QUalitätseinstellung beim CPU-Encoding. Das sieht man dann sehr deutlich.
Richtig. Der oben beschriebene Effekt wird umso deutlicher, je geringer die akzeptable Bitrate eingestellt ist. Denn wenn die Kodiereffizienz nicht gut ist (wie bei GPUs) ist das weniger schlimm wenn ich eben die Bitrate hochballern kann. Darf der Encoder das nicht wirds hässlich. Da die GPU keine Möglichkeit hat, mehr Informationen pro Byte abzulegen wie die CPU es mit überlegenen Algorithmen kann wird das Ergebnis sehr unschön - in aller Regel sieht man das schnell durch "blocking"/Artefakte.
CPU ist sicher ohne Frage schon etwas besser, aber ist der Unterschied wirklich so relevant, dass man sich den Unterschied im Zeit- und Energieaufwand geben will?
Kommt auf die Zielsetzung an. Wie gesagt wenns drum geht Videos für YT zu machen ist GPU-Encoding super. Es ist schnell und die Bitrate/Dateigröße ist eh wurscht weils YouTube speichern muss und nicht du. Willst du dagegen dein Hochzeitsvideo für die Nachwelt sichern würde ich den Teufel tun und die GPU da ranlassen. Da wäre ein HEVC10 + slow preset / CRF18 ein vernünftiger Anfang.