libx264 ile 10 bit'te 4: 2: 2 kodlama


10

Libx264'ün şimdi 10-bit 4: 2: 2 kodlamaları yapabileceğine inanıyorum, ancak işe yaramayacak gibi görünmüyorum. Ben ffmpeg (aşağıdaki bilgi) kullanıyorum ve ben de doğrudan x264 kodlayıcı denedim. denedim

ffmpeg.exe -i input.mov -c:v libx264 -profile:v high422 -crf 20 -pix_fmt yuv422p output.mp4

ve bu güzel 4: 2: 2 çıktı üretir, ancak sadece 8 bit derinlikte,

[libx264 @ 00000000055a9de0] profile High 4:2:2, level 4.0, 4:2:2 8-bit

ve denedim

ffmpeg.exe -i input.mov -c:v libx264 -profile:v high10 -crf 20 -pix_fmt yuv422p output.mp4

ve bu bana hata veriyor:

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

X264 --fullhelp belgelerinde şunları bulurum:

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

Böylece 10 bit derinlikte 4: 2: 2 ve hatta 10 bitte 4: 4: 4 yapabilir, ancak çıkış bit derinliğinin nasıl ayarlanacağına dair bir gösterge yoktur. --input-depth <integer> Specify input bit depth for raw inputÇıkış bit derinliği için başka bir seçenek yoktur.


2
Bunu buldum: x264.nl/x264/10bit_02-ateme-why_does_10bit_save_bandwidth.pdf Görünüşe göre 10bit ile daha iyi sıkıştırma verimliliği (boyut ve kalite) elde edersiniz. Kodlamayı çok yavaş değilse, 10 bit'i düzenli olarak kullanmaya başlayabilirim.
Peter Cordes

Yanıtlar:


12

x264 hem 8 bit hem de 10 bit çıkışları destekler ve özel bir şey yapmanız gerekmez.

ffmpeg

Kullanıyorsanız ffmpeglibx264 tarafından hangi piksel biçimlerinin ve bit derinliklerinin desteklendiğini görebilirsiniz:

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

10 bit piksel formatları şunlardır: yuv420p10le, yuv422p10le, yuv444p10le.

x264

x264Desteklenen bit derinliklerini de kontrol edebilirsiniz :

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

Daha önce x264'ü derlemeniz --bit-depth=10ve ardından ffmpeg8 bit veya 10 bit libx264'e bağlamanız gerekiyordu , ancak bu artık gerekli değil. Daha fazla bilgi için bkz. 8 bit ve 10 bit CLI ve kitaplıkları birleştirme .


Kahretsin, bu işleri karmaşık hale getiriyor. Bu yüzden iki x264 kütüphanesine bağlı iki ffmpeg ikili dosyasına ihtiyacım olacak. 10bit x264'ün herhangi bir yerinde statik yapı olup olmadığını biliyor musunuz?
stib

Bunları burada bulabilirsiniz: download.videolan.org/pub/x264/binaries Kendiniz inşa etmek istiyorsanız, mingw, yasm, git ve gcc ve çok fazla mucking yükleyen çok uzun bir sarma işlemi var: doom10.org /index.php?topic=26.0 Ancak, git'e izin vermeyen aptal kurumsal güvenlik duvarı nedeniyle işe yaramadım.
stib

Belki Zeranoe böyle bir yapı sağlamak için alabilirsiniz . Üzgünüm, Windows söz konusu olduğunda oldukça yararsızım.
llogan

Yani ben, sorun bu. Bir derleme isteği gönderdim, nasıl gittiğini göreceğiz.
stib

1
FWIW bugünlerde libx264 "ikisi de" inanıyorum ...
rogerdpack

6

edit: Başarıyla Ducks Take Off 10bit kodlama yaptım .

İlk yol: libx264'ü statik olarak bağlayan 10bit x264 ikili dosyası oluşturdum.

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

(ultrafast ve düşük kalite çünkü bu bir kalite kanıtı değil, kavramın bir kanıtıdır.) Bunu swscale ile derlemedim. (Libavutil'de bir RGB pix fmt ya da başka bir şeyden memnun değildi). Giriş renk aralığı uyuşmuyorsa hata --output-csp i444veriyor, bu da yanlışlıkla kroma x264 alt örneği almak istemiyorsanız gerçekten güzel. yuv444p14le.y4m10bit çıktı üreten birkaç kare beslediğimde iyi çalıştı . (Bit derinliğini kesebilir, ancak swscale olmadan kroma örneklemez.)

İkinci yol: LD_LIBRARY_PATH10 bit libx264.so seçmek için kullanın

Her şey için aynı ffmpeg dinamik bağlantılı ikili programı kullanabilirsiniz.

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

Bu kalite ayarlarıyla görsel olarak hiçbir şey görmeye çalışmadım. Sadece hızlı çalışmasını ve bir sürü disk alanını boşa harcamamasını istedim, çünkü her şeyde varyasyonları denerken çok sayıda çıktı dosyası oluşturuyorum.

Büyük y4m verilerinin ayrı bir x264 sürecine aktarılmaması, 12 yerine 14 fps'ye gitmesini sağladı, bu yüzden ultrafast için iyi bir hızlanma. Daha yavaş kodlamalar bu yükü cüce eder.

Kaynağım 48bit RGB. Correct_rnd çıktı mkv üzerinde hiçbir etkisi olduğunu buldum. (bit özdeş hiçbir ile sonuçları -sws_flagsile, -sws_flags +accurate_rndve -vf scale=flags=accurate_rndmkv başlığında, muhtemelen randomize mkv UUID birkaç bit hariç. Hatta birlikte -qp 0, hatasını yuvarlamadan kaybetme değildi bu yüzden. cmp -l f1 f2 | lessolabilir ikili dosyaları karşılaştırmak için İlk farktan sonra aynı. Veya ssdeep -pbelki de accurate_rndşimdi varsayılan?)

Eğer ffmpeg'in varsayılan bicubik yerine chroma: lanczos'u örneklemesine izin veriyorsanız, önemli olan bir ffmpeg swscaler bayrağı vardır. (Lanczos'un hala yüksek kalite için en iyi seçim olarak kabul edildiğini varsayıyorum? Bir süredir okumadım.)

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

Ekleme +lanczosiçin -sws_flagsçalışmaz:

[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!

Eğer girişi 10 bit'ten daha derin beslemeye çalışırsanız, ffmpeg reddeder.

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

Aslında, ffmpeg'in libx264 sürücüsü her zaman x264'ü tam olarak derlendiği bit derinliğini beslemede ısrar ediyor. örneğin -pix_fmt yuv420p:

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

x264.h diyor ki:

/* 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;

Ben dahili olarak x264 (CLI) her zaman piksel formatlarını dönüştürmek zorunda olduğunu düşünüyorum, kod her fonksiyonun 8bit giriş, 10bit çıkış sürümleri yok. Ve ayrıca, çeşitli giriş bit derinliklerinin kabul edilmesinin kütüphane API'sinde değil, sadece x264 CLI'de olduğunu düşünüyorum . Daha yüksek bitler ayarlanmış olan API girişini beslediğinizde ne olduğunu merak ediyorum ... (ffpeg, kodu hacklemeden bunu yapmanıza izin vermez, bu yüzden bu, herkesin kaçınması konusunda endişelenmesi gereken bir şey değildir.)

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

Hiçbir pix_fmt belirtilmediğinde, ffmpeg yuv444p10lergb girişi verildiğinde seçer . Ya da libx264rgb, 8 bit rgb'yi 16 bit (10'u önemli) ve segfaultlar> bekleyen fonksiyonlara besler. Bunu yukarı doğru rapor edeceğim ...

 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)

Bunu yukarı doğru rapor edeceğim.

Her neyse, ffmpeg veya libx264, libx265'in yüksek bit derlemeli sürümleriyle ve istediğiniz başka bir programla çalıştırmak istediğiniz başka bir program için kendime çift bit derinlikli bir ortam oluşturmak çok kolay oldu. . (Bu yüzden daha kısa bir isim için "10bit" değil "highdepth" dedim.)

düzenleme sonu: aşağıda yeniden derleme olmadan başıboş benim. Ve win64 için ffmpeg'in nasıl derleneceği hakkında iyi bir fikir

Bunu kendim denedim, çünkü x264'e yüksek bit derinliği girdisini beslemeye çalışan bir cmdline ile denemediniz.

ffmpeg piksel biçim adları ( ffmpeg -pix_fmts) yalnızca bir düzenleme belirtmez, tam bir bit düzenlemesiyle eşleşir ve bu nedenle her biçim + bit derinliği birleşiminin farklı bir adı vardır. Sanırım -pix_fmt yuv422p"girişimle aynı bit derinliğinde 422'ye dönüştür" demek istediniz.

wikipedia , h.264'ün sadece Hi444PP ile 8-14 bit derinliği desteklediğini, diğerlerinin ise sadece 10 bit olduğunu söylüyor. Hi444PP, x264'ün -qp 0veya için kullandığı tahmini kayıpsız kodlamayı destekleyen tek profildir -crf 0. edit: AFAICT, x264 hala sadece 8, 9 veya 10 bit için derlenmeyi destekler.

Her neyse, yerel x264'ümü yeniden derlemediğim için işe yaramayan bir komuttan bir sürü işe yaramaz çıktı. (Ama yeniden derlenmiş x264 ile çalışmalıdır. Ben kendim oynamak istersem bu cevabı düzenleyebilirim.)

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)

Incompatible pixel format 'yuv420p10le' for codec 'libx264', auto-selecting format 'yuv420p'Çizgiyi not edin .

Muhtemelen ihtiyacım yoktu -profileve yüksek bit derinliğinde x264 ile işe yarayacaktı. (ve potansiyel olarak ffmpeg çağrıları 444 10bit seçin yuva444p10le.) Bence yüksek bit derinliği x264 kabul edebilir yuv444p14le, ama yine de sadece 10bit h.264 üretebilir. Cmdline x264 --fullhelp, çıkış bit derinliği hakkında 8'den 10'a kadar oldukça açıktır, daha yüksek değildir. Garip -profile high10sadece sessizce 8bit x264 tarafından göz ardı edilir.

Dahili olarak, yüksek bit derinliği için derlenen x264, herhangi bir 10bit veri depolamak için 16bpp kullanır, bu nedenle muhtemelen 16bit değerlerle hareket arama ve benzeri işlemleri yapar. Ve 6 bit göz ardı edilemeyecek bir hız olmadıkça, DCT 10 bit yerine 16 bit daha yüksek olabilir. Bu, DCT'den önce 10 bit'e yuvarlandığınızdan biraz farklı DCT katsayıları üretebilir. (Böylece potansiyel olarak x264'e beslemeden önce 10bit'e dönüştürmekten farklı çıkış elde edersiniz, buna 12, 14 veya 16bit verir.) Pro. Yine de, koda bakın veya bir şeyler yapmadan önce deneyin. Bu paragrafa güvenme. : P

(edit: ffmpeg, bileşen başına 10 bit'ten fazla x264-10bit beslemez. Bit derinliğini azaltmak için swscale kullanır.)

Yüksek bit derinliği için derlendiğinde x264 ve x265'i global değişkenler ve API işlevleri için farklı adlar kullanmanın ne kadar zor olacağını merak ediyorum. Daha sonra her iki sürümü de aynı anda oluşturabilir ve her ikisine de ffmpeg bağlayabilirsiniz. Ffmpeg libx264ve libx264rgbsarmalayıcılar, giriş akışına bağlı olarak API'nin uygun sürümünü çağırmaya özen gösterebilir. (Aksi halde ihtiyacım olacağını -c:v libx264-deepveya libx264rgb-deepFfmpeg 4 farklı x264 "codec" olmak üzere toplam.)

Windows için ffmpeg derleme nasıl

edit: Windows için, ben LD_LIBRARY_PATHbir libx264 DLL kadar uygun bir şey olduğunu sanmıyorum , bu yüzden en iyi bahis hala yüksek bit derinliği statik bir ikili ve normal kullanım için başka bir tane oluşturmaktır. Yüksek derinlikli libx264, normal derinlik h.264'ü hiç veremez. Sadece bir hız cezası değil, olamaz.

Windows için kendi ffmpeg'inizi (statik ikili) derlemenin en kolay yolu https://github.com/rdp/ffmpeg-windows-build-helpers . git repoyu bir Linux makinesinde klonlayın (veya belki OS X gibi çalışan bir gcc'ye sahip başka bir sistem), ardından çalıştırın

./cross_compile_ffmpeg.sh --high-bitdepth=y --disable-nonfree=n --build-choice=win64

Bu, ilk çalıştırma için yaklaşık 8 saat sürdü, çünkü mingw-cross-compile GCC'yi kaynaktan ve diğer her şeyle birlikte oluşturdu. (gcc, başlangıçta kötü bir derleyici ile derlemeniz durumunda, önyükleme için birkaç kez kendini yeniden yapılandırır.)

Derleme komut dosyasını güncelleyebilir git pullve yeniden çalıştırmak, ffmpeg, x264, x265 ve belki de derlediği diğer bazı projeler için en son git güncellemelerini çeker. (Çoğu için sadece tarballs indirir.)

Linux masaüstüm yaşını gösteriyor. Çoğunlukla oyunlar için kullandığım bir wintendo'm var. Video kodlama ile uğraşmaya başladığımdan beri, dört çekirdekli Sandybridge'i de bunun için oldukça yararlı buluyorum. x265 için. Muhtemelen x265'in bazı işlevleri AVX / SSE4 için sadece asm sürümlerine sahiptir, bu yüzden SSSE3 Linux makinemde (Conroe) C'ye geri dönüyor. Bu ya da 1 fps'de daha belirgindir ...


Düzenleme yaptığımda stackexchange insanları bilgilendirir mi? olmaması durumunda bir yorum gönderme.
Peter Cordes

dinamik bağlantının kullanıldığı OS X'te bu çok daha basittir. Basitçe brew reinstall x264 --with-10-bitve bitirdiniz, ffmpeg yeni x264 lezzetini kullanacak :)
Görünen Ad

1
@SargeBorsch: Bu cevabın amacı, her iki lezzetin de aynı zamana sahip olmasıydı, böylece kütüphaneyi yeniden yüklemeden 8 bit ve 10 bit'i karşılaştırabilirsiniz. OS X dinamik bağlantısı Linux ile hemen hemen aynı şekilde çalışır, burada istediğiniz gibi libx264 kurulumunuzu diğer lezzet ile değiştirebilirsiniz.
Peter Cordes

@PeterCordes hmm, benim hatam. Haklısın
Görünen Ad

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.