Saya percaya bahwa libx264 sekarang mampu melakukan penyandian 10-bit 4: 2: 2, tapi sepertinya saya tidak bisa membuatnya berfungsi. Saya menggunakan ffmpeg (info di bawah), dan saya juga mencoba encoder x264 secara langsung. Saya sudah mencoba
ffmpeg.exe -i input.mov -c:v libx264 -profile:v high422 -crf 20 -pix_fmt yuv422p output.mp4
dan itu menghasilkan output 4: 2: 2 yang bagus, tetapi hanya pada kedalaman 8 bit,
[libx264 @ 00000000055a9de0] profile High 4:2:2, level 4.0, 4:2:2 8-bit
dan saya sudah mencoba
ffmpeg.exe -i input.mov -c:v libx264 -profile:v high10 -crf 20 -pix_fmt yuv422p output.mp4
dan itu memberi saya kesalahan:
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
Dalam dokumentasi x264 --fullhelp saya temukan:
--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.
Jadi dapat dilakukan 4: 2: 2 pada kedalaman 10 bit, dan bahkan 4: 4: 4 pada 10 bit tampaknya, tetapi tidak ada indikasi bagaimana mengatur kedalaman bit output. Ada pilihan --input-depth <integer> Specify input bit depth for raw input
tetapi tidak ada untuk kedalaman bit output.
Jawaban:
x264 mendukung keluaran 8-bit dan 10-bit, dan Anda tidak perlu melakukan sesuatu yang istimewa.
ffmpeg
Jika menggunakan,
ffmpeg
Anda dapat melihat format piksel dan kedalaman bit apa yang didukung oleh libx264:Format piksel 10-bit adalah: yuv420p10le, yuv422p10le, yuv444p10le.
x264
Anda juga dapat memeriksa
x264
kedalaman bit yang didukung:Sebelumnya Anda harus mengkompilasi x264 dengan
--bit-depth=10
, dan kemudian menautkan Andaffmpeg
ke libx264 8-bit atau 10-bit, tetapi itu sekarang tidak perlu. Lihat Menyatukan CLI dan perpustakaan 8-bit dan 10-bit untuk info lebih lanjut.sumber
sunting: Saya berhasil membuat 10bit penyandian Ducks Take Off .
Cara pertama: Saya membuat biner 10bit x264 yang secara statis menghubungkan libx264.
(kualitas sangat cepat dan rendah karena ini adalah bukti konsep, bukan tes kualitas.) Saya tidak mengkompilasinya dengan swscale. (Itu tidak senang tentang RGB pix fmt di libavutil atau sesuatu). Kesalahan keluar jika input colorspace tidak cocok
--output-csp i444
, yang sebenarnya bagus jika Anda tidak ingin x264 sengaja downsample kromanya. Ini bekerja dengan baik ketika saya memberinya beberapa frameyuv444p14le.y4m
, menghasilkan output 10bit. (Ini dapat memotong kedalaman bit, tetapi tidak mengurangi kroma tanpa swscale.)Cara kedua: gunakan
LD_LIBRARY_PATH
untuk memilih libx264.so 10bitAnda dapat menggunakan biner ffmpeg dynamic-linked yang sama untuk semuanya.
Saya jelas tidak mencoba melihat apa pun secara visual dengan pengaturan kualitas itu. Saya hanya ingin itu berjalan cepat, dan tidak menyia-nyiakan banyak ruang disk karena saya selalu membuat banyak file output ketika mencoba variasi pada hal-hal.
Tidak menyalurkan data y4m besar-besaran ke proses x264 terpisah membuatnya menjadi 14 fps, bukan 12, jadi percepatan yang layak untuk ultrafast. Pengkodean yang lebih lambat akan mengecilkan overhead itu.
Sumber saya adalah 48bit RGB. Saya menemukan bahwa akurat_rnd tidak berpengaruh pada mkv keluaran. (hasil bit-identik dengan tidak
-sws_flags
, dengan-sws_flags +accurate_rnd
, dan-vf scale=flags=accurate_rnd
, kecuali untuk beberapa bit di header mkv, mungkin UUID mkv acak. Bahkan dengan-qp 0
, jadi saya tidak kehilangan itu untuk kesalahan pembulatan.cmp -l f1 f2 | less
untuk membandingkan file biner yang mungkin menjadi sama setelah beberapa perbedaan awal. Ataussdeep -p
. Mungkinaccurate_rnd
default sekarang?)Ada satu flag fsmpeg swscaler yang penting, jika Anda membiarkan ffmpeg menurunkan sampel kroma Anda: lanczos alih-alih bicubic default. (Saya berasumsi lanczos masih dianggap sebagai pilihan terbaik untuk kualitas tinggi? Belum membaca untuk sementara waktu.)
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
Menambahkan
+lanczos
ke-sws_flags
tidak berfungsi:Jika Anda mencoba memasukkannya lebih dari 10 bit, ffmpeg menolak.
Sebenarnya, libx264 driver ffmpeg selalu bersikeras memberi makan x264 persis kedalaman bit yang dikompilasikan untuk itu. misalnya dengan
-pix_fmt yuv420p
:x264.h mengatakan:
Saya pikir secara internal x264 (CLI) selalu harus meningkatkan format piksel, kode tidak memiliki input 8bit, versi keluaran 10bit dari setiap fungsi. Dan juga, saya pikir menerima berbagai kedalaman bit input hanya di CLI x264, bukan API perpustakaan. Saya ingin tahu apa yang terjadi ketika Anda memberi makan input API di mana ada bit yang lebih tinggi yang ditetapkan ... (ffpeg tidak memungkinkan Anda untuk melakukan ini tanpa meretas kode, jadi ini bukan sesuatu yang perlu dikhawatirkan oleh siapa pun untuk menghindari.)
Tanpa ditentukan pix_fmt, ffmpeg memilih
yuv444p10le
ketika diberikan input rgb. Atau denganlibx264rgb
, itu memberi makan 8bit rgb ke fungsi yang mengharapkan 16bit (10 di antaranya signifikan), dan segfaults>. <. Saya akan melaporkan bahwa hulu ...Saya akan melaporkan itu ke hulu.
Bagaimanapun, ternyata sangat mudah untuk membangun sendiri lingkungan dual-bit-ffmpeg, atau program lain yang ingin Anda jalankan dengan libx264, libx265, dan apa pun yang Anda inginkan. . (Itu sebabnya saya menyebutnya "highdepth", bukan hanya "10bit" untuk nama yang lebih pendek.)
akhir edit: di bawah ini adalah rambling saya tanpa kompilasi ulang. Dan sedikit tentang cara cross-compile ffmpeg untuk win64
Mencoba ini sendiri, karena Anda tidak mencoba dengan cmdline yang mencoba untuk memberi makan input kedalaman bit tinggi ke x264.
ffmpeg nama format piksel (
ffmpeg -pix_fmts
) tidak hanya menentukan pengaturan, mereka memetakan ke pengaturan bit yang tepat, dan karenanya setiap format + kombo kedalaman bit memiliki nama yang berbeda. Saya pikir Anda mengharapkan-pix_fmt yuv422p
"konversi ke 422 pada kedalaman bit yang sama dengan input saya".wikipedia mengatakan h.264 mendukung kedalaman 8-14 bit hanya dengan Hi444PP, yang lain hanya hingga 10 bit. Hi444PP adalah satu-satunya profil yang mendukung pengkodean lossless prediktif, yang digunakan x264 untuk
-qp 0
atau-crf 0
. sunting: AFAICT, x264 masih hanya mendukung yang dikompilasi untuk 8, 9, atau 10 bit.Bagaimanapun, berikut adalah sekelompok keluaran yang tidak berguna dari sebuah perintah yang tidak berfungsi karena saya tidak mengkompilasi ulang x264 lokal saya. (Tetapi itu harus bekerja dengan x264 yang dikompilasi. Saya mungkin mengedit jawaban ini jika saya ingin bermain dengannya sendiri.)
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
Perhatikan
Incompatible pixel format 'yuv420p10le' for codec 'libx264', auto-selecting format 'yuv420p'
barisnya.Mungkin saya tidak perlu
-profile
, dan dengan x264 kedalaman bit tinggi, itu hanya akan berfungsi. (dan berpotensi memilih 444 10bit, yang disebut dengan ffmpegyuva444p10le
.) Saya pikir x264 kedalaman bit yang tinggi dapat diterimayuv444p14le
, tetapi masih hanya menghasilkan 10bit h.264. Cmdlinex264 --fullhelp
cukup eksplisit tentang kedalaman bit output dari 8 hingga 10, tidak lebih tinggi. Aneh yang-profile high10
diam-diam diabaikan oleh 8bit x264.Secara internal, x264 dikompilasi untuk kedalaman bit tinggi menggunakan 16bpp untuk menyimpan data 10bit, sehingga mungkin melakukan pencarian gerak dan sebagainya dengan nilai 16bit. Dan mungkin DCT 16bit lebih tinggi daripada 10bit, kecuali ada kecepatan yang bisa diperoleh dari mengabaikan 6 bit. Ini bisa menghasilkan koefisien DCT yang sedikit berbeda dari jika Anda dibulatkan menjadi 10bit sebelum DCT. (Jadi Anda berpotensi mendapatkan output yang berbeda dari mengonversi ke 10bit sebelum mengumpankan ke x264, vs. memberikannya 12, 14, atau 16bit.) Saya harus prob. lihat kodenya atau coba sebelum mengada-ada. Jangan percayai paragraf ini. : P
(sunting: ffmpeg tidak akan memberi makan x264-10bit apapun lebih dari 10 bit per komponen. Ini akan menggunakan swscale untuk mengurangi kedalaman bit itu sendiri.)
Saya bertanya-tanya betapa sulitnya untuk menambal x264 dan x265 untuk menggunakan nama yang berbeda untuk variabel global dan fungsi API, ketika dikompilasi untuk kedalaman bit tinggi. Kemudian Anda bisa membangun kedua versi sekaligus, dan memiliki ffmpeg yang terhubung dengan keduanya. Ffmpeg
libx264
danlibx264rgb
pembungkus dapat menangani memanggil versi yang tepat dari api tergantung pada aliran input. (Kalau tidak, Anda perlu-c:v libx264-deep
ataulibx264rgb-deep
, untuk total 4 "codec" x264 berbeda di ffmpeg.)Bagaimana cara cross compile ffmpeg untuk windows
sunting: Untuk windows, saya rasa tidak ada yang
LD_LIBRARY_PATH
semudah libx264 DLL, jadi taruhan terbaik Anda adalah membangun biner statis dengan kedalaman bit tinggi, dan satu lagi untuk penggunaan normal. Libx264 Kedalaman tinggi TIDAK BISA menampilkan kedalaman normal h.264 sama sekali. Bukan hanya penalti kecepatan, itu tidak bisa.Cara termudah untuk mengompilasi ffmpeg (biner statis) Anda sendiri untuk windows adalah dengan https://github.com/rdp/ffmpeg-windows-build-helpers . git mengkloning repo pada mesin Linux (atau mungkin sistem lain dengan gcc yang berfungsi, seperti OS X?), lalu jalankan
./cross_compile_ffmpeg.sh --high-bitdepth=y --disable-nonfree=n --build-choice=win64
Ini memakan waktu sekitar 8 jam untuk menjalankan pertama, karena membangun GCC mingw-cross-compile dari sumber, bersama dengan yang lainnya. (gcc default untuk membangun kembali sendiri beberapa kali untuk bootstrap, jika Anda awalnya mengkompilasinya dengan kompiler yang buruk.)
Anda dapat memperbarui skrip build
git pull
, dan menjalankannya kembali akan menarik pembaruan git terbaru untuk ffmpeg, x264, x265, dan mungkin beberapa proyek lain yang dikompilasi dari sumber. (Sebagian besar hanya mengunduh tarbal.)Desktop Linux saya menunjukkan umurnya. Saya memiliki wintendo yang kebanyakan saya gunakan untuk gim. Karena saya mulai bermain-main dengan pengkodean video, saya menemukan Sandybridge quad-core cukup berguna untuk itu, terutama. untuk x265. Mungkin beberapa fungsi x265 hanya memiliki versi asm untuk AVX / SSE4, jadi jatuh kembali ke C pada mesin Linux SSSE3 saya (Conroe). Itu atau lebih terlihat pada 1fps ...
sumber
brew reinstall x264 --with-10-bit
dan Anda selesai, ffmpeg akan menggunakan rasa x264 baru :)Saya mengunduh ffmpeg dari tautan di bawah ini https://sourceforge.net/projects/ffmpeg-hi/?source=typ_redirect
Dan masukkan perintah di bawah ini untuk membuat file 4: 2: 2 10bit h.264. ffmpeg-hi10-heaac.exe -i "im.mp4" -c: v libx264 -pix_fmt yuv422p10le yuv-high-.ts
sumber