Ich glaube, dass libx264 jetzt 10-Bit-4: 2: 2-Codierungen ausführen kann, aber ich kann es scheinbar nicht zum Laufen bringen. Ich verwende ffmpeg (Info unten) und habe auch den x264-Encoder direkt ausprobiert. ich habe es versucht
ffmpeg.exe -i input.mov -c:v libx264 -profile:v high422 -crf 20 -pix_fmt yuv422p output.mp4
und das ergibt eine schöne 4: 2: 2 Ausgabe, aber nur bei 8 Bit Tiefe,
[libx264 @ 00000000055a9de0] profile High 4:2:2, level 4.0, 4:2:2 8-bit
und ich habe es versucht
ffmpeg.exe -i input.mov -c:v libx264 -profile:v high10 -crf 20 -pix_fmt yuv422p output.mp4
und das gibt mir den Fehler:
x264 [error]: high10 profile doesn't support 4:2:2
[libx264 @ 00000000051ead60] Error setting profile high10.
[libx264 @ 00000000051ead60] Possible profiles: baseline main high high10 high422 high444
In der x264 --fullhelp Dokumentation finde ich:
--profile <string> Force the limits of an H.264 profile
Overrides all settings.
[...]
- high10:
No lossless.
Support for bit depth 8-10.
- high422:
No lossless.
Support for bit depth 8-10.
Support for 4:2:0/4:2:2 chroma subsampling.
- high444:
Support for bit depth 8-10.
Support for 4:2:0/4:2:2/4:4:4 chroma subsampling.
Es kann also 4: 2: 2 bei 10 Bit Tiefe und sogar 4: 4: 4 bei 10 Bit anscheinend tun, aber es gibt keinen Hinweis darauf, wie die Ausgabebittiefe eingestellt werden soll. Es gibt eine Option, --input-depth <integer> Specify input bit depth for raw input
aber nichts für die Ausgabebittiefe.
Antworten:
x264 unterstützt sowohl 8-Bit- als auch 10-Bit-Ausgänge, und Sie müssen nichts Besonderes tun.
ffmpeg
Bei Verwendung können
ffmpeg
Sie sehen, welche Pixelformate und Bittiefen von libx264 unterstützt werden:10-Bit-Pixelformate sind: yuv420p10le, yuv422p10le, yuv444p10le.
x264
Sie können auch
x264
nach unterstützten Bittiefen suchen:Früher mussten Sie x264 mit kompilieren
--bit-depth=10
und dannffmpeg
entweder mit einer 8-Bit- oder einer 10-Bit-libx264 verknüpfen, aber das ist jetzt nicht mehr erforderlich. Weitere Informationen finden Sie unter Vereinheitlichen von 8-Bit- und 10-Bit-CLI und -Bibliotheken .quelle
Bearbeiten: Ich habe erfolgreich eine 10-Bit-Codierung von Ducks Take Off erstellt .
Erster Weg: Ich habe eine 10-Bit-x264-Binärdatei erstellt, die libx264 statisch verknüpft.
(Ultraschnelle und niedrige Qualität, da es sich um einen Proof of Concept handelt, nicht um einen Qualitätstest.) Ich habe es nicht mit swscale kompiliert. (Es war unglücklich über ein RGB-Bild in libavutil oder so). Es tritt ein Fehler auf, wenn der Eingabefarbraum nicht übereinstimmt. Dies
--output-csp i444
ist eigentlich hilfreich , wenn Sie nicht versehentlich möchten, dass x264 die Farbintensität herabsetzt . Es hat gut funktioniert, als ich ein paar Framesyuv444p14le.y4m
mit 10-Bit-Ausgabe gespeist habe . (Es kann die Bittiefe abschneiden, aber die Farbintensität ohne swscale nicht herabsetzen.)Zweiter Weg: Verwenden
LD_LIBRARY_PATH
Sie diese Option, um eine 10-Bit-libx264.so auszuwählenSie können für alles dieselbe dynamisch verknüpfte ffmpeg-Binärdatei verwenden.
Ich habe offensichtlich nicht versucht, mit diesen Qualitätseinstellungen etwas visuell zu sehen. Ich wollte nur, dass es schnell läuft und nicht viel Speicherplatz verschwendet, da ich beim Ausprobieren von Variationen immer viele Ausgabedateien erstelle.
Wenn die massiven y4m-Daten nicht an einen separaten x264-Prozess weitergeleitet wurden, wurden 14 statt 12 fps erreicht, was für ultraschnelle Geschwindigkeit eine anständige Beschleunigung darstellt. Langsamere Codierungen werden diesen Overhead in den Schatten stellen.
Meine Quelle ist 48bit RGB. Ich fand, dass genaues_rnd keinen Einfluss auf die Ausgabe mkv hatte. (bitidentische Ergebnisse mit no
-sws_flags
, with-sws_flags +accurate_rnd
und-vf scale=flags=accurate_rnd
, abgesehen von ein paar Bits im mkv-Header, wahrscheinlich der zufälligen mkv-UUID. Auch mit-qp 0
, damit ich sie nicht durch Rundungsfehler verliere.cmp -l f1 f2 | less
um Binärdateien zu vergleichen, die die sein könnten Gleiches nach einem anfänglichen Unterschied. Oderssdeep -p
. Ist vielleichtaccurate_rnd
jetzt die Standardeinstellung?)Es gibt ein ffmpeg-swscaler-Flag, das wichtig ist, wenn Sie ffmpeg Ihr Chroma heruntersampeln lassen: lanczos anstelle des Standard-Bicubic. (Ich gehe davon aus, dass Lanczos immer noch als die beste Wahl für hohe Qualität angesehen wird? Ich habe eine Weile nicht gelesen.)
highdepth-ffmpeg -i in -pix_fmt yuv420p10le ...encode...opts...
-vf scale=flags=lanczos -sws_flags +accurate_rnd+print_info with_ld_path.420p10.accurate_rnd.lanczos.mkv
Hinzufügen
+lanczos
zu-sws_flags
funktioniert nicht:Wenn Sie versuchen, die Eingabe tiefer als 10 Bit einzugeben, lehnt ffmpeg ab.
Tatsächlich besteht der libx264-Treiber von ffmpeg immer darauf, x264 genau mit der Bittiefe zu versorgen, für die es kompiliert wurde. zB mit
-pix_fmt yuv420p
:x264.h sagt:
Ich denke, intern muss x264 (die CLI) immer Pixelformate hochkonvertieren, der Code hat nicht 8-Bit-Eingänge, 10-Bit-Ausgangsversionen jeder Funktion. Außerdem denke ich, dass das Akzeptieren verschiedener Eingabebittiefen nur in der x264-CLI erfolgt, nicht in der Bibliotheks-API. Ich bin gespannt, was passiert, wenn Sie die API-Eingabe mit höheren Bits füttern ... (ffpeg erlaubt Ihnen dies nicht, ohne den Code zu hacken, daher muss sich niemand darum kümmern, dies zu vermeiden.)
Wenn keine pix_fmt angegeben ist, wählt ffmpeg,
yuv444p10le
wenn eine RGB-Eingabe erfolgt. Oder mitlibx264rgb
speist es 8-Bit-RGB an Funktionen, die 16-Bit (von denen 10 signifikant sind) und Segfaults>. <Erwarten. Ich werde das stromaufwärts melden ...Ich werde das stromaufwärts melden.
Wie auch immer, es stellte sich heraus, dass es verdammt einfach war, mir eine Umgebung mit zwei Bittiefen für ffmpeg oder ein anderes Programm zu erstellen, das Sie mit kompilierten Versionen von libx264, libx265 und allem anderen ausführen möchten . (Deshalb habe ich es "hohe Tiefe" genannt, nicht nur "10 Bit" für einen kürzeren Namen.)
Ende der Bearbeitung: Hier sind meine Streifzüge ohne Neukompilierung. Und ein gutes Stück darüber, wie man ffmpeg für win64 kompiliert
Ich habe es selbst versucht, da Sie es nicht mit einer cmdline versucht haben, die versucht hat, x264 Eingaben mit hoher Bittiefe zuzuführen.
ffmpeg Pixelformatnamen (
ffmpeg -pix_fmts
) geben nicht nur eine Anordnung an, sondern werden einer exakten Bitanordnung zugeordnet. Daher hat jede Kombination aus Format und Bittiefe einen anderen Namen. Ich denke, Sie hatten erwartet-pix_fmt yuv422p
, "in der gleichen Bittiefe wie meine Eingabe in 422 konvertieren" zu bedeuten.Wikipedia sagt, dass h.264 8-14 Bit Tiefe nur mit Hi444PP unterstützt, andere sind nur bis zu 10 Bit. Hi444PP ist das einzige Profil, das verlustfreie Vorhersagecodierung unterstützt, die x264 für
-qp 0
oder verwendet-crf 0
. edit: AFAICT, x264 unterstützt immer noch nur das Kompilieren für 8, 9 oder 10 Bit.Wie auch immer, hier ist eine Reihe nutzloser Ausgaben eines Befehls, der nicht funktioniert, weil ich mein lokales x264 nicht neu kompiliert habe. (Aber es sollte mit neu kompiliertem x264 funktionieren. Ich könnte diese Antwort bearbeiten, wenn ich selbst damit spielen möchte.)
ffmpeg -v verbose -framerate 50 -f image2 -pattern_type glob -i ./3_DucksTakeOff_720p50_CgrLevels_SINC_FILTER_SVTdec05_/'*'.sgi -c:v libx264 -pix_fmt yuv420p10le -profile high10 yuv-high.mkv
Beachten Sie die
Incompatible pixel format 'yuv420p10le' for codec 'libx264', auto-selecting format 'yuv420p'
Zeile.Wahrscheinlich brauchte ich das nicht
-profile
und mit einem x264 mit hoher Bittiefe würde es einfach funktionieren. (und möglicherweise 444 10bit auswählen, was ffmpeg aufruftyuva444p10le
.) Ich denke, hohe Bittiefe x264 könnte akzeptierenyuv444p14le
, würde aber immer noch nur 10bit h.264 produzieren. Die cmdlinex264 --fullhelp
ist ziemlich explizit über die Ausgabebittiefe von 8 bis 10, nicht höher. Seltsam, dass-profile high10
8bit x264 dies einfach stillschweigend ignoriert.Intern verwendet x264, das für eine hohe Bittiefe kompiliert wurde, 16 Bit / s zum Speichern von 10-Bit-Daten, sodass wahrscheinlich eine Bewegungssuche usw. mit 16-Bit-Werten durchgeführt wird. Und könnte DCT höher sein als 16 Bit anstatt 10 Bit, es sei denn, durch das Ignorieren von 6 Bit kann Geschwindigkeit gewonnen werden. Dies kann zu geringfügig anderen DCT-Koeffizienten führen, als wenn Sie vor der DCT auf 10 Bit abgerundet hätten. (Sie erhalten also möglicherweise eine andere Ausgabe, wenn Sie vor dem Einspeisen in x264 auf 10 Bit konvertieren, anstatt 12, 14 oder 16 Bit.) Ich sollte prob. Schauen Sie sich den Code an oder probieren Sie ihn aus, bevor Sie sich etwas ausdenken. Traue diesem Absatz nicht. : P.
(edit: ffmpeg speist x264-10bit nicht mehr als 10bit pro Komponente ein. Es wird swscale verwenden, um die Bittiefe selbst zu reduzieren.)
Ich frage mich, wie schwierig es wäre, x264 und x265 zu patchen, um unterschiedliche Namen für globale Variablen und API-Funktionen zu verwenden, wenn diese für eine hohe Bittiefe kompiliert werden. Dann könnten Sie beide Versionen gleichzeitig erstellen und ffmpeg mit beiden verknüpfen. Das ffmpeg
libx264
und dielibx264rgb
Wrapper könnten dafür sorgen, dass die entsprechende Version der API abhängig vom Eingabestream aufgerufen wird. (Andernfalls benötigen Sie-c:v libx264-deep
oderlibx264rgb-deep
für insgesamt 4 verschiedene x264 "Codecs" in ffmpeg.)Kompilieren von ffmpeg für Windows
Bearbeiten: Für Windows gibt es
LD_LIBRARY_PATH
meines Erachtens nichts Bequemeres als für eine libx264-DLL. Daher ist es am besten, eine statische Binärdatei mit hoher Bittiefe und eine andere für den normalen Gebrauch zu erstellen. High-Depth Libx264 kann überhaupt keine normale Tiefe h.264 ausgeben. Nicht nur eine Geschwindigkeitsstrafe, es kann einfach nicht.Der einfachste Weg, um Ihr eigenes ffmpeg (statische Binärdatei) für Windows zu kompilieren, ist mit https://github.com/rdp/ffmpeg-windows-build-helpers . git klonen Sie das Repo auf einem Linux-Computer (oder einem anderen System mit einem funktionierenden gcc wie OS X?) und führen Sie es dann aus
./cross_compile_ffmpeg.sh --high-bitdepth=y --disable-nonfree=n --build-choice=win64
Dies dauerte ungefähr 8 Stunden für den ersten Lauf, da Mingw-Cross-Compile-GCC zusammen mit allem anderen aus dem Quellcode erstellt wurde. (gcc erstellt sich standardmäßig mehrmals neu, um Bootstrap zu erstellen, falls Sie es ursprünglich mit einem fehlerhaften Compiler kompiliert haben.)
Sie können das Build-Skript mit aktualisieren
git pull
und durch erneutes Ausführen werden die neuesten Git-Updates für ffmpeg, x264, x265 und möglicherweise einige der anderen Projekte abgerufen, die es aus dem Quellcode kompiliert. (Für die meisten werden nur Tarballs heruntergeladen.)Mein Linux-Desktop zeigt sein Alter. Ich habe ein Nintendo, das ich hauptsächlich für Spiele benutze. Seit ich angefangen habe, mit der Videokodierung herumzuspielen, finde ich die Quad-Core-Sandybridge auch dafür ziemlich nützlich, insb. für x265. Wahrscheinlich haben einige der Funktionen von x265 nur ASM-Versionen für AVX / SSE4, sodass auf meinem SSSE3-Linux-Computer (Conroe) auf C zurückgegriffen wird. Das oder es fällt bei 1fps deutlicher auf ...
quelle
brew reinstall x264 --with-10-bit
und Sie sind fertig, ffmpeg wird die neue x264-Variante verwenden :)Ich habe das ffmpeg über den folgenden Link heruntergeladen: https://sourceforge.net/projects/ffmpeg-hi/?source=typ_redirect
Geben Sie den folgenden Befehl ein, um eine 4: 2: 2 10-Bit-h.264-Datei zu erstellen. ffmpeg-hi10-heaac.exe -i "im.mp4" -c: v libx264 -pix_fmt yuv422p10le yuv-high-.ts
quelle