encoding 4: 2: 2 dalam 10-bit dengan libx264


9

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 inputtetapi tidak ada untuk kedalaman bit output.


2
Saya menemukan ini: x264.nl/x264/10bit_02-ateme-why_does_10bit_save_bandwidth.pdf Tampaknya Anda mendapatkan efisiensi kompresi yang lebih baik (ukuran vs kualitas) dengan 10bit. Saya mungkin mulai menggunakan 10bit secara teratur, jika tidak terlalu lambat untuk dikodekan.
Peter Cordes

Jawaban:


12

x264 mendukung keluaran 8-bit dan 10-bit, dan Anda tidak perlu melakukan sesuatu yang istimewa.

ffmpeg

Jika menggunakan, ffmpegAnda dapat melihat format piksel dan kedalaman bit apa yang didukung oleh libx264:

$ ffmpeg -h encoder=libx264
  [...]
  Supported pixel formats: yuv420p yuvj420p yuv422p yuvj422p yuv444p yuvj444p nv12 nv16 nv21 yuv420p10le yuv422p10le yuv444p10le nv20le

Format piksel 10-bit adalah: yuv420p10le, yuv422p10le, yuv444p10le.

x264

Anda juga dapat memeriksa x264kedalaman bit yang didukung:

$ x264 --help
  [...]
  Output bit depth: 8/10

Sebelumnya Anda harus mengkompilasi x264 dengan --bit-depth=10, dan kemudian menautkan Anda ffmpegke 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.


Sial, itu membuat semuanya jadi rumit. Jadi saya akan membutuhkan dua binari ffmpeg yang terhubung dengan dua pustaka x264. Apakah Anda tahu jika ada build statis 10bit x264 di mana saja?
stib

Menemukan mereka di sini Anda akan: download.videolan.org/pub/x264/binaries Jika Anda ingin membangun sendiri ada proses yang sangat panjang tele invoving menginstal mingw, yasm, git dan gcc dan banyak mucking sekitar sini: doom10.org /index.php?topic=26.0 Tapi saya tidak bisa menjalankannya, terutama karena firewall korporat bodoh yang tidak mengizinkan git.
stib

Mungkin Anda bisa membuat Zeranoe menyediakan bangunan seperti itu. Maaf, saya cukup tidak berguna ketika datang ke Windows.
llogan

Jadi saya, itulah masalahnya. Saya telah mengirim permintaan build, kita akan lihat bagaimana hasilnya.
stib

1
FWIW hari ini libx264 adalah "keduanya" Saya percaya ...
rogerdpack

6

sunting: Saya berhasil membuat 10bit penyandian Ducks Take Off .

Cara pertama: Saya membuat biner 10bit x264 yang secara statis menghubungkan libx264.

cp -al x264-git x264-10bit  # instead of changing my normal git checkout
cd x264-10bit
./configure --extra-cflags=-march=native --enable-static --disable-interlaced --bit-depth=10
make -j2
sudo install x264 /usr/local/bin/x264-10bit

mkfifo pipe.y4m
ffmpeg -v verbose -i in -pix_fmt yuv420p10le -strict experimental -f yuv4mpegpipe pipe.y4m
   (open another shell window / tab / screen(1) window):
x264 pipe.y4m --crf 30 --preset ultrafast -o 10bit-420.mkv

(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 frame yuv444p14le.y4m, menghasilkan output 10bit. (Ini dapat memotong kedalaman bit, tetapi tidak mengurangi kroma tanpa swscale.)

Cara kedua: gunakan LD_LIBRARY_PATHuntuk memilih libx264.so 10bit

Anda dapat menggunakan biner ffmpeg dynamic-linked yang sama untuk semuanya.

cp -al x264-git x264-10bit  # instead of changing my normal git checkout
cd x264-10bit
./configure  --extra-cflags=-march=native '--libdir=/usr/local/lib/high-bit-depth-codec' '--includedir=/usr/local/lib/high-bit-depth-codec/include' --disable-cli --enable-shared --disable-interlaced --bit-depth=10
make -j2
sudo make install-lib-shared  # this Makefile target depends on install-lib-dev, hence setting --includedir

alias highdepth-ffmpeg='LD_LIBRARY_PATH=/usr/local/lib/high-bit-depth-codec ffmpeg'

highdepth-ffmpeg -v verbose -framerate 50 -f image2 \
-pattern_type glob -i ./3_DucksTakeOff_720p50_CgrLevels_SINC_FILTER_SVTdec05_/'*'.sgi \
-pix_fmt yuv420p10le -crf 30 -preset ultrafast \
-sws_flags +accurate_rnd+print_info  \
with_ld_path.420p10.accurate_rnd.mkv
ffmpeg version N-68044-gb9dd809 Copyright (c) 2000-2015 the FFmpeg developers
  built on Jan 14 2015 23:21:08 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: --enable-gpl --enable-version3 --enable-nonfree --disable-doc --disable-ffserver --enable-libbluray --enable-libschroedinger --enable-libtheora --enable-libx264 --enable-libx265 --enable-libmp3lame --enable-libopus --enable-libwebp --enable-libvpx --disable-outdev=oss --disable-indev=oss --disable-encoder=vorbis --enable-libvorbis --enable-libfdk-aac --disable-encoder=aac --disable-decoder=jpeg2000 --enable-libvidstab
  libavutil      54. 16.100 / 54. 16.100
  libavcodec     56. 20.100 / 56. 20.100
  libavformat    56. 18.101 / 56. 18.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5.  7.101 /  5.  7.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, image2, from './3_DucksTakeOff_720p50_CgrLevels_SINC_FILTER_SVTdec05_/*.sgi':
  Duration: 00:00:10.00, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: sgi, rgb48be, 1280x720, 50 tbr, 50 tbn, 50 tbc
[graph 0 input from stream 0:0 @ 0x1b6d8c0] w:1280 h:720 pixfmt:rgb48be tb:1/50 fr:50/1 sar:0/1 sws_param:flags=2
[auto-inserted scaler 0 @ 0x1b7dae0] w:iw h:ih flags:'0x41004' interl:0
[format @ 0x1b7e940] auto-inserting filter 'auto-inserted scaler 0' between the filter 'Parsed_null_0' and the filter 'format'
SwScaler: reducing / aligning filtersize 1 -> 4
    Last message repeated 1 times
SwScaler: reducing / aligning filtersize 1 -> 1
SwScaler: reducing / aligning filtersize 9 -> 8
[swscaler @ 0x1b500c0] bicubic scaler, from rgb48be to yuv420p10le using MMXEXT
[swscaler @ 0x1b500c0] 1280x720 -> 1280x720
[auto-inserted scaler 0 @ 0x1b7dae0] w:1280 h:720 fmt:rgb48be sar:0/1 -> w:1280 h:720 fmt:yuv420p10le sar:0/1 flags:0x41004
[libx264 @ 0x1b78da0] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowShuffle
[libx264 @ 0x1b78da0] profile High 10, level 3.2, 4:2:0 10-bit
[libx264 @ 0x1b78da0] 264 - core 144 r2525+2 6a4fca8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=30.0 qcomp=0.60 qpmin=0 qpmax=81 qpstep=4 ip_ratio=1.40 aq=0
Output #0, matroska, to 'with_ld_path.420p10.accurate_rnd.mkv':
  Metadata:
    encoder         : Lavf56.18.101
    Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), yuv420p10le, 1280x720, q=-1--1, 50 fps, 1k tbn, 50 tbc
    Metadata:
      encoder         : Lavc56.20.100 libx264
Stream mapping:
  Stream #0:0 -> #0:0 (sgi (native) -> h264 (libx264))
Press [q] to stop, [?] for help
No more output streams to write to, finishing.e=00:00:09.84 bitrate=12060.2kbits/s    
frame=  500 fps= 14 q=-1.0 Lsize=   14714kB time=00:00:10.00 bitrate=12053.5kbits/s    
video:14709kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.031423%
Input file #0 (./3_DucksTakeOff_720p50_CgrLevels_SINC_FILTER_SVTdec05_/*.sgi):
  Input stream #0:0 (video): 500 packets read (2765056000 bytes); 500 frames decoded; 
  Total: 500 packets (2765056000 bytes) demuxed
Output file #0 (with_ld_path.420p10.accurate_rnd.mkv):
  Output stream #0:0 (video): 500 frames encoded; 500 packets muxed (15062147 bytes); 
  Total: 500 packets (15062147 bytes) muxed
[libx264 @ 0x1b78da0] frame I:2     Avg QP:43.00  size:144760
[libx264 @ 0x1b78da0] frame P:498   Avg QP:49.83  size: 29663
[libx264 @ 0x1b78da0] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 0x1b78da0] mb P  I16..4:  5.1%  0.0%  0.0%  P16..4: 79.3%  0.0%  0.0%  0.0%  0.0%    skip:15.6%
[libx264 @ 0x1b78da0] coded y,uvDC,uvAC intra: 67.8% 60.5% 41.9% inter: 50.1% 16.3% 2.8%
[libx264 @ 0x1b78da0] i16 v,h,dc,p:  5% 54% 33%  8%
[libx264 @ 0x1b78da0] i8c dc,h,v,p: 53% 39%  6%  3%
[libx264 @ 0x1b78da0] kb/s:12049.24
(same bitrate and stats as with the y4m pipe,
so it behaves the same with the same input data... good.)

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 | lessuntuk membandingkan file biner yang mungkin menjadi sama setelah beberapa perbedaan awal. Atau ssdeep -p. Mungkin accurate_rnddefault 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 +lanczoske -sws_flagstidak berfungsi:

[format @ 0x28e4940] auto-inserting filter 'auto-inserted scaler 0' between the filter 'Parsed_null_0' and the filter 'format'
[swscaler @ 0x28b60c0] Exactly one scaler algorithm must be chosen, got 204
[auto-inserted scaler 0 @ 0x28e3ae0] Failed to configure output pad on auto-inserted scaler 0
Error opening filters!

Jika Anda mencoba memasukkannya lebih dari 10 bit, ffmpeg menolak.

highdepth-ffmpeg ... -pix_fmt yuv444p14le
[graph 0 input from stream 0:0 @ 0x36ec9c0] w:1280 h:720 pixfmt:rgb48be tb:1/50 fr:50/1 sar:0/1 sws_param:flags=2
Incompatible pixel format 'yuv444p14le' for codec 'libx264', auto-selecting format 'yuv444p10le'
[Parsed_scale_0 @ 0x36e2a00] w:1280 h:720 fmt:rgb48be sar:0/1 -> w:1280 h:720 fmt:yuv444p10le sar:0/1 flags:0x200
[libx264 @ 0x3701d80] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowShuffle
[libx264 @ 0x3701d80] profile High 4:4:4 Predictive, level 3.2, 4:4:4 10-bit

Sebenarnya, libx264 driver ffmpeg selalu bersikeras memberi makan x264 persis kedalaman bit yang dikompilasikan untuk itu. misalnya dengan -pix_fmt yuv420p:

Incompatible pixel format 'yuv420p' for codec 'libx264', auto-selecting format 'yuv420p10le'

x264.h mengatakan:

/* x264_bit_depth:
 *      Specifies the number of bits per pixel that x264 uses. This is also the
 *      bit depth that x264 encodes in. If this value is > 8, x264 will read
 *      two bytes of input data for each pixel sample, and expect the upper
 *      (16-x264_bit_depth) bits to be zero.
 *      Note: The flag X264_CSP_HIGH_DEPTH must be used to specify the
 *      colorspace depth as well. */
X264_API extern const int x264_bit_depth;

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.)

frame.c:370:  So this is why ffmpeg can't give 8-bit input to libx264
#if HIGH_BIT_DEPTH
    if( !(src->img.i_csp & X264_CSP_HIGH_DEPTH) )
    {
        x264_log( h, X264_LOG_ERROR, "This build of x264 requires high depth input. Rebuild to support 8-bit input.\n" );
        return -1;
    }
#else

Tanpa ditentukan pix_fmt, ffmpeg memilih yuv444p10leketika diberikan input rgb. Atau dengan libx264rgb, itu memberi makan 8bit rgb ke fungsi yang mengharapkan 16bit (10 di antaranya signifikan), dan segfaults>. <. Saya akan melaporkan bahwa hulu ...

 highdepth-ffmpeg -v verbose -framerate 50 -f image2 -pattern_type glob -i ./3_DucksTakeOff_720p50_CgrLevels_SINC_FILTER_SVTdec05_/'*'.sgi  -qp 0 -preset ultrafast -sws_flags print_info+accurate_rnd -frames 2  -c:v libx264rgb lossless.rgb.mkv
ffmpeg version N-68044-gb9dd809 Copyright (c) 2000-2015 the FFmpeg developers
  built on Jan 14 2015 23:21:08 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: --enable-gpl --enable-version3 --enable-nonfree --disable-doc --disable-ffserver --enable-libbluray --enable-libschroedinger --enable-libtheora --enable-libx264 --enable-libx265 --enable-libmp3lame --enable-libopus --enable-libwebp --enable-libvpx --disable-outdev=oss --disable-indev=oss --disable-encoder=vorbis --enable-libvorbis --enable-libfdk-aac --disable-encoder=aac --disable-decoder=jpeg2000 --enable-libvidstab
  libavutil      54. 16.100 / 54. 16.100
  libavcodec     56. 20.100 / 56. 20.100
  libavformat    56. 18.101 / 56. 18.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5.  7.101 /  5.  7.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, image2, from './3_DucksTakeOff_720p50_CgrLevels_SINC_FILTER_SVTdec05_/*.sgi':
  Duration: 00:00:10.00, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: sgi, rgb48be, 1280x720, 50 tbr, 50 tbn, 50 tbc
[graph 0 input from stream 0:0 @ 0x1eb9660] w:1280 h:720 pixfmt:rgb48be tb:1/50 fr:50/1 sar:0/1 sws_param:flags=2
[auto-inserted scaler 0 @ 0x1eba120] w:iw h:ih flags:'0x41000' interl:0
[format @ 0x1eb94c0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'Parsed_null_0' and the filter 'format'
SwScaler: reducing / aligning filtersize 1 -> 4
    Last message repeated 1 times
SwScaler: reducing / aligning filtersize 1 -> 1
    Last message repeated 1 times
[swscaler @ 0x1eba480] bicubic scaler, from rgb48be to rgb24 using MMXEXT
[swscaler @ 0x1eba480] 1280x720 -> 1280x720
[auto-inserted scaler 0 @ 0x1eba120] w:1280 h:720 fmt:rgb48be sar:0/1 -> w:1280 h:720 fmt:rgb24 sar:0/1 flags:0x41000
No pixel format specified, rgb24 for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264rgb @ 0x1ecf020] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowShuffle
[libx264rgb @ 0x1ecf020] profile High 4:4:4 Predictive, level 3.2, 4:4:4 10-bit
[libx264rgb @ 0x1ecf020] 264 - core 144 r2525+2 6a4fca8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=0 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, matroska, to 'lossless.rgb.mkv':
  Metadata:
    encoder         : Lavf56.18.101
    Stream #0:0: Video: h264 (libx264rgb) (H264 / 0x34363248), rgb24, 1280x720, q=-1--1, 50 fps, 1k tbn, 50 tbc
    Metadata:
      encoder         : Lavc56.20.100 libx264rgb
Stream mapping:
  Stream #0:0 -> #0:0 (sgi (native) -> h264 (libx264rgb))
Press [q] to stop, [?] for help
No more output streams to write to, finishing.
Segmentation fault (core dumped)

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 0atau -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

ffmpeg version N-68044-gb9dd809 Copyright (c) 2000-2015 the FFmpeg developers
  built on Jan 14 2015 23:21:08 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: --enable-gpl --enable-version3 --enable-nonfree --disable-doc --disable-ffserver --enable-libbluray --enable-libschroedinger --enable-libtheora --enable-libx264 --enable-libx265 --enable-libmp3lame --enable-libopus --enable-libwebp --enable-libvpx --disable-outdev=oss --disable-indev=oss --disable-encoder=vorbis --enable-libvorbis --enable-libfdk-aac --disable-encoder=aac --disable-decoder=jpeg2000 --enable-libvidstab
  libavutil      54. 16.100 / 54. 16.100
  libavcodec     56. 20.100 / 56. 20.100
  libavformat    56. 18.101 / 56. 18.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5.  7.101 /  5.  7.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, image2, from './3_DucksTakeOff_720p50_CgrLevels_SINC_FILTER_SVTdec05_/*.sgi':
  Duration: 00:00:10.00, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: sgi, rgb48be, 1280x720, 50 tbr, 50 tbn, 50 tbc
Please use -profile:a or -profile:v, -profile is ambiguous
File 'yuv-high.mkv' already exists. Overwrite ? [y/N] y
[graph 0 input from stream 0:0 @ 0x24797e0] w:1280 h:720 pixfmt:rgb48be tb:1/50 fr:50/1 sar:0/1 sws_param:flags=2
Incompatible pixel format 'yuv420p10le' for codec 'libx264', auto-selecting format 'yuv420p'
[auto-inserted scaler 0 @ 0x24938c0] w:iw h:ih flags:'0x4' interl:0
[format @ 0x2494680] auto-inserting filter 'auto-inserted scaler 0' between the filter 'Parsed_null_0' and the filter 'format'
[auto-inserted scaler 0 @ 0x24938c0] w:1280 h:720 fmt:rgb48be sar:0/1 -> w:1280 h:720 fmt:yuv420p sar:0/1 flags:0x4
[libx264 @ 0x248eda0] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowShuffle
[libx264 @ 0x248eda0] profile High, level 3.2
[libx264 @ 0x248eda0] 264 - core 144 r2525+2 6a4fca8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, matroska, to 'yuv-high.mkv':
  Metadata:
    encoder         : Lavf56.18.101
    Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), yuv420p, 1280x720, q=-1--1, 50 fps, 1k tbn, 50 tbc
    Metadata:
      encoder         : Lavc56.20.100 libx264
Stream mapping:
  Stream #0:0 -> #0:0 (sgi (native) -> h264 (libx264))
Press [q] to stop, [?] for help
No more output streams to write to, finishing.e=00:00:09.02 bitrate=18034.6kbits/s    
frame=  500 fps=6.6 q=-1.0 Lsize=   21568kB time=00:00:09.96 bitrate=17739.6kbits/s    
video:21564kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.020773%
Input file #0 (./3_DucksTakeOff_720p50_CgrLevels_SINC_FILTER_SVTdec05_/*.sgi):
  Input stream #0:0 (video): 500 packets read (2765056000 bytes); 500 frames decoded; 
  Total: 500 packets (2765056000 bytes) demuxed
Output file #0 (yuv-high.mkv):
  Output stream #0:0 (video): 500 frames encoded; 500 packets muxed (22081186 bytes); 
  Total: 500 packets (22081186 bytes) muxed
[libx264 @ 0x248eda0] frame I:2     Avg QP:29.33  size:131874
[libx264 @ 0x248eda0] frame P:257   Avg QP:31.07  size: 75444
[libx264 @ 0x248eda0] frame B:241   Avg QP:33.54  size: 10073
[libx264 @ 0x248eda0] consecutive B-frames:  3.6% 96.4%  0.0%  0.0%
[libx264 @ 0x248eda0] mb I  I16..4:  0.1% 71.9% 28.0%
[libx264 @ 0x248eda0] mb P  I16..4:  0.0%  4.5%  1.1%  P16..4: 36.1% 37.6% 19.6%  0.0%  0.0%    skip: 1.0%
[libx264 @ 0x248eda0] mb B  I16..4:  0.0%  0.2%  0.1%  B16..8: 34.3%  2.6%  1.1%  direct: 9.6%  skip:52.2%  L0: 6.2% L1:46.6% BI:47.2%
[libx264 @ 0x248eda0] 8x8 transform intra:78.4% inter:60.4%
[libx264 @ 0x248eda0] coded y,uvDC,uvAC intra: 98.3% 95.3% 85.9% inter: 51.7% 34.8% 12.8%
[libx264 @ 0x248eda0] i16 v,h,dc,p:  5% 77%  4% 14%
[libx264 @ 0x248eda0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:  2% 43% 11%  3%  5%  2% 16%  2% 16%
[libx264 @ 0x248eda0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu:  3% 40%  9%  4%  6%  3% 17%  2% 16%
[libx264 @ 0x248eda0] i8c dc,h,v,p: 47% 40%  6%  7%
[libx264 @ 0x248eda0] Weighted P-Frames: Y:1.2% UV:0.4%
[libx264 @ 0x248eda0] ref P L0: 70.9% 26.5%  1.8%  0.7%  0.0%
[libx264 @ 0x248eda0] ref B L0: 99.5%  0.5%
[libx264 @ 0x248eda0] kb/s:17664.40

$ x264 --fullhelp | less
...
Output bit depth: 8 (configured at compile time)

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 ffmpeg yuva444p10le.) Saya pikir x264 kedalaman bit yang tinggi dapat diterima yuv444p14le, tetapi masih hanya menghasilkan 10bit h.264. Cmdline x264 --fullhelpcukup eksplisit tentang kedalaman bit output dari 8 hingga 10, tidak lebih tinggi. Aneh yang -profile high10diam-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 libx264dan libx264rgbpembungkus dapat menangani memanggil versi yang tepat dari api tergantung pada aliran input. (Kalau tidak, Anda perlu -c:v libx264-deepatau libx264rgb-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_PATHsemudah 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 ...


Apakah stackexchange memberi tahu orang-orang ketika saya mengedit? memposting komentar jika tidak.
Peter Cordes

ini jauh lebih sederhana di OS X, di mana penghubung dinamis digunakan. Cukup brew reinstall x264 --with-10-bitdan Anda selesai, ffmpeg akan menggunakan rasa x264 baru :)
Nama Tampilan

1
@SargeBorsch: inti dari jawaban ini adalah untuk memiliki kedua rasa yang diinstal PADA SAAT YANG SAMA, sehingga Anda dapat membandingkan 8bit dan 10bit tanpa menginstal ulang perpustakaan. Tautan dinamis OS X berfungsi hampir sama dengan Linux, di mana Anda bisa mengganti instal libx264 Anda dengan citarasa lain jika Anda mau.
Peter Cordes

@PeterCordes hmm, salahku. Anda benar
Nama Tampilan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.