Wierzę, że libx264 jest teraz w stanie wykonywać 10-bitowe kodowanie 4: 2: 2, ale wydaje mi się, że nie mogę go uruchomić. Używam ffmpeg (informacje poniżej), a także bezpośrednio wypróbowałem koder x264. próbowałem
ffmpeg.exe -i input.mov -c:v libx264 -profile:v high422 -crf 20 -pix_fmt yuv422p output.mp4
i to daje niezły wynik 4: 2: 2, ale tylko przy 8-bitowej głębokości,
[libx264 @ 00000000055a9de0] profile High 4:2:2, level 4.0, 4:2:2 8-bit
i próbowałem
ffmpeg.exe -i input.mov -c:v libx264 -profile:v high10 -crf 20 -pix_fmt yuv422p output.mp4
i to daje mi błąd:
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
W pełnej dokumentacji x264 znajduję:
--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.
Może więc wykonywać 4: 2: 2 przy 10-bitowej głębokości, a nawet 4: 4: 4 przy 10 bitach, ale nic nie wskazuje na to, jak ustawić wyjściową głębię bitową. Istnieje opcja, --input-depth <integer> Specify input bit depth for raw input
ale brak głębokości wyjściowego bitu.
Odpowiedzi:
x264 obsługuje wyjścia 8-bitowe i 10-bitowe i nie musisz robić nic specjalnego.
ffmpeg
Jeśli używasz
ffmpeg
, możesz zobaczyć, jakie formaty pikseli i głębokości bitów są obsługiwane przez libx264:10-bitowe formaty pikseli to: yuv420p10le, yuv422p10le, yuv444p10le.
x264
Możesz także sprawdzić
x264
obsługiwane głębokości bitów:Wcześniej musiałeś skompilować x264
--bit-depth=10
, a następnie połączyćffmpeg
go z 8-bitowym lub 10-bitowym libx264, ale teraz nie jest to konieczne. Zobacz Unify 8-i 10-bitowy interfejs CLI i biblioteki, aby uzyskać więcej informacji.źródło
edycja: Z powodzeniem stworzyłem 10-bitowy kod Ducks Take Off .
Pierwszy sposób: zbudowałem 10-bitowy plik binarny x264, który statycznie łączy libx264.
(ultraszybka i niska jakość, ponieważ jest to dowód koncepcji, a nie test jakości.) Nie skompilowałem go za pomocą swscale. (Był niezadowolony z fmt RGB pix w libavutil czy coś takiego). Występuje błąd, jeśli wejściowa przestrzeń kolorów nie jest zgodna
--output-csp i444
, co jest naprawdę fajne, jeśli nie chcesz przypadkowo mieć próbki x264 próbkowania barwy. Działa dobrze, gdy nakarmiłem go kilkoma ramkamiyuv444p14le.y4m
, generując 10-bitowy sygnał wyjściowy. (Może obcinać głębię bitową, ale nie może próbkować koloru bez skalowania.)Drugi sposób: użyj,
LD_LIBRARY_PATH
aby wybrać 10-bitowy plik libx264.soMożesz użyć tego samego binarnego pliku dynamicznego ffmpeg do wszystkiego.
Oczywiście przy tych ustawieniach jakości nie próbowałem niczego widzieć wizualnie. Chciałem tylko, aby działał szybko i nie marnował dużo miejsca na dysku, ponieważ zawsze próbuję tworzyć różne wersje plików.
Brak przesyłania potokowych danych y4m do osobnego procesu x264 spowodował, że osiągnęło 14 fps zamiast 12, więc przyzwoite przyspieszenie dla ultraszybkiego. Wolniejsze kodowanie przyćmiewa ten nad głową.
Moje źródło to 48bit RGB. Odkryłem, że dokładny_rnd nie miał wpływu na wyjściowy mkv. (wyniki identyczne pod względem bitów bez
-sws_flags
, z-sws_flags +accurate_rnd
, i-vf scale=flags=accurate_rnd
, z wyjątkiem kilku bitów w nagłówku mkv, prawdopodobnie losowy UUID mkv. Nawet z-qp 0
, więc nie straciłem go na błąd zaokrąglania.cmp -l f1 f2 | less
aby porównać pliki binarne, które mogą być to samo po początkowej różnicy. Lubssdeep -p
. Możeaccurate_rnd
teraz jest domyślna?)Istnieje jedna flaga swscaler ffmpeg, która ma znaczenie, jeśli pozwalasz ffmpeg na próbkowanie swojego chroma: lanczos zamiast domyślnego bicubic. (Zakładam, że lanczos jest nadal uważane za najlepszy wybór dla wysokiej jakości? Nie czytałem od dłuższego czasu.)
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
Dodawanie
+lanczos
do-sws_flags
nie działa:Jeśli spróbujesz wprowadzić go głębiej niż 10 bitów, ffmpeg odmawia.
W rzeczywistości sterownik libx264 ffmpeg zawsze nalega na podawanie x264 dokładnie takiej głębokości bitowej, jaką jest skompilowane. np. z
-pix_fmt yuv420p
:x264.h mówi:
Myślę, że wewnętrznie x264 (CLI) zawsze musi konwertować w górę formaty pikseli, kod nie ma wejścia 8-bitowego, wersje 10-bitowe każdej funkcji. Myślę też, że akceptowanie różnych głębokości bitów wejściowych odbywa się tylko w interfejsie CLI x264, a nie w interfejsie API biblioteki. Jestem ciekawy, co dzieje się, gdy podajesz dane wejściowe API, w których ustawiono wyższe bity ... (ffpeg nie pozwala ci tego zrobić bez włamania się do kodu, więc nie jest to coś, o co trzeba się martwić.)
Bez określonego pix_fmt, ffmpeg wybiera,
yuv444p10le
kiedy otrzyma dane wejściowe rgb. Lub za pomocąlibx264rgb
, przekazuje 8bit rgb do funkcji, które oczekują 16bit (z czego 10 jest znaczących) i segfaults>. <. Pójdę to zgłosić ...Zgłoszę to na początku.
W każdym razie okazuje się, że zbudowanie środowiska podwójnej głębi dla ffmpeg lub dowolnego innego programu, który chcesz uruchomić, z wersjami libx264, libx265 i wszystkim innym, co chcesz, było łatwe. . (Dlatego nazwałem to „highdepth”, a nie „10bit” dla krótszej nazwy.)
koniec edycji: poniżej są moje wędrówki bez ponownej kompilacji. I sporo o tym, jak skompilować krzyżowo ffmpeg dla win64
Próbowałem tego sam, ponieważ nie próbowałeś z cmdline, która próbowała zasilić wejście x264 o wysokiej głębi bitowej.
Nazwy formatu pikseli ffmpeg (
ffmpeg -pix_fmts
) nie tylko określają aranżację, lecz odwzorowują na dokładną aranżację bitów, dlatego też każda kombinacja format + głębia bitowa ma inną nazwę. Myślę, że miałeś-pix_fmt yuv422p
na myśli „konwersję na 422 na tej samej głębokości bitów co moje wejście”.wikipedia mówi, że h.264 obsługuje głębokość 8-14 bitów tylko z Hi444PP, inne mają jedynie 10 bitów. Hi444PP jest jedynym profilem obsługującym predykcyjne bezstratne kodowanie, którego x264 używa dla
-qp 0
lub-crf 0
. edycja: AFAICT, x264 nadal obsługuje kompilację tylko dla 8, 9 lub 10 bitów.W każdym razie, oto kilka bezużytecznych danych wyjściowych z polecenia, które nie działa, ponieważ nie skompilowałem mojego lokalnego x264. (Ale powinno działać z przekompilowanym x264. Mogę edytować tę odpowiedź, jeśli chcę się nią bawić).
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
Zwróć uwagę na
Incompatible pixel format 'yuv420p10le' for codec 'libx264', auto-selecting format 'yuv420p'
linię.Prawdopodobnie nie potrzebowałem
-profile
, a przy dużej głębi x264 to po prostu zadziałałoby. (i potencjalnie wybierz 444 10 bitów, które wywołuje ffmpegyuva444p10le
.) Myślę, że duża głębia bitów x264 mogłaby zaakceptowaćyuv444p14le
, ale nadal produkowałaby tylko 10 bitów h.264. Cmdlinex264 --fullhelp
jest dość wyraźny na temat głębokości bitów wyjściowych od 8 do 10, nie więcej. Dziwne, które-profile high10
jest po prostu dyskretnie ignorowane przez 8bit x264.Wewnętrznie x264 skompilowany dla dużej głębi bitowej wykorzystuje 16 bpp do przechowywania dowolnych 10-bitowych danych, więc prawdopodobnie wykonuje wyszukiwanie ruchu i tak dalej z wartościami 16-bitowymi. I może DCT wyższy niż 16-bitowy, a nie 10-bitowy, chyba że można uzyskać szybkość ignorowania 6 bitów. Może to generować nieco inne współczynniki DCT niż w przypadku zaokrąglenia w dół do 10 bitów przed DCT. (Więc potencjalnie możesz uzyskać inną moc wyjściową z konwersji do 10 bitów przed karmieniem do x264, w porównaniu z dawaniem jej 12, 14 lub 16 bitów.) Powinienem sondować. spójrz na kod lub wypróbuj go, zanim coś wymyślisz. Nie ufaj temu ustępowi. : P
(edycja: ffmpeg nie przesyła x264-10bit niczego więcej niż 10 bitów na komponent. Użyje swscale do zmniejszenia samej głębi bitowej).
Zastanawiam się, jak trudno byłoby łatać x264 i x265, aby używać różnych nazw dla zmiennych globalnych i funkcji API, gdy są one kompilowane dla dużej głębi bitów. Następnie możesz zbudować obie wersje naraz i połączyć ffmpeg z obiema. Ffmpeg
libx264
ilibx264rgb
owijarki mogą zadbać o wywołanie odpowiedniej wersji interfejsu API w zależności od strumienia wejściowego. (W przeciwnym razie potrzebujesz-c:v libx264-deep
lublibx264rgb-deep
, w sumie, 4 różne „kodeki” x264 w ffmpeg.)Jak krzyżować kompilację ffmpeg dla Windows
edycja: W przypadku systemu Windows nie wydaje mi się, aby istniało coś tak wygodnego, jak
LD_LIBRARY_PATH
w przypadku biblioteki DLL libx264, więc najlepszym rozwiązaniem jest zbudowanie statycznego pliku binarnego o dużej głębokości i innego do normalnego użytku. Libx264 o dużej głębokości w ogóle NIE może wyprowadzać normalnej głębokości h.264. Nie tylko kara prędkości, po prostu nie może.Najprostszym sposobem na skompilowanie własnego pliku ffmpeg (statyczny plik binarny) dla systemu Windows jest https://github.com/rdp/ffmpeg-windows-build-helpers . git klonuje repozytorium na komputerze z systemem Linux (a może innym systemie z działającym gcc, takim jak OS X?), a następnie uruchom
./cross_compile_ffmpeg.sh --high-bitdepth=y --disable-nonfree=n --build-choice=win64
Pierwsze uruchomienie zajęło około 8 godzin, ponieważ zbudowano GCC z kompilacją mingw-cross-source ze źródła, wraz ze wszystkim innym. (gcc domyślnie kilkakrotnie przebudowuje się, aby uruchomić bootstrap, na wypadek, gdybyś pierwotnie kompilował go za pomocą złego kompilatora).
Możesz zaktualizować skrypt kompilacji
git pull
, a jego ponowne uruchomienie spowoduje pobranie najnowszych aktualizacji git dla ffmpeg, x264, x265 i być może niektórych innych projektów, które kompiluje ze źródła. (Dla większości po prostu pobiera tarballi.)Mój pulpit z systemem Linux pokazuje swój wiek. Mam wintendo, którego najczęściej używam do gier. Odkąd zacząłem bawić się w kodowanie wideo, uważam, że jego czterordzeniowy Sandybridge jest do tego bardzo przydatny, szczególnie. dla x265. Prawdopodobnie niektóre funkcje x265 mają tylko wersje asm dla AVX / SSE4, więc wracają do C na mojej maszynie SSSE3 Linux (Conroe). To lub bardziej zauważalne przy 1 klatce na sekundę ...
źródło
brew reinstall x264 --with-10-bit
i gotowe, ffmpeg użyje nowego smaku x264 :)Pobrałem plik ffmpeg z poniższego linku https://sourceforge.net/projects/ffmpeg-hi/?source=typ_redirect
I wprowadziłem poniższe polecenie, aby utworzyć plik H.264 10: 4: 2: 2. ffmpeg-hi10-heaac.exe -i "im.mp4" -c: v libx264 -pix_fmt yuv422p10le yuv-high-.ts
źródło