libx264를 사용하여 10 비트로 4 : 2 : 2 인코딩


10

libx264는 이제 10 비트 4 : 2 : 2 인코딩을 수행 할 수 있다고 생각하지만 제대로 작동하지 않는 것 같습니다. ffmpeg (아래 정보)를 사용하고 있으며 x264 인코더를 직접 시도했습니다. 난 노력 했어

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

멋진 4 : 2 : 2 출력을 생성하지만 8 비트 깊이에서만

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

그리고 나는 노력했다

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

그리고 그것은 나에게 오류를 준다 :

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 문서에서 다음을 발견했습니다.

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

따라서 10 비트 깊이에서는 4 : 2 : 2, 10 비트에서는 4 : 4 : 4까지 가능하지만 출력 비트 깊이를 설정하는 방법에 대한 표시는 없습니다. --input-depth <integer> Specify input bit depth for raw input출력 비트 깊이 에는 옵션이 있지만 아무것도 없습니다.


2
나는 이것을 찾았습니다 : x264.nl/x264/10bit_02-ateme-why_does_10bit_save_bandwidth.pdf 분명히 당신은 10bit로 더 나은 압축 효율 (크기 대 품질)을 얻습니다. 인코딩 속도가 느리지 않으면 10 비트를 정기적으로 사용하기 시작할 수 있습니다.
Peter Cordes

답변:


12

x264는 8 비트 및 10 비트 출력을 모두 지원하므로 특별한 작업을 수행 할 필요가 없습니다.

ffmpeg

사용 ffmpeg하는 경우 libx264가 지원하는 픽셀 형식 및 비트 심도 를 확인할 수 있습니다.

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

10 비트 픽셀 형식은 yuv420p10le, yuv422p10le, yuv444p10le입니다.

x264

x264지원되는 비트 심도를 확인할 수도 있습니다 .

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

이전 에는를 사용 --bit-depth=10하여 x264를 컴파일 한 다음 ffmpeg8 비트 또는 10 비트 libx264에 링크해야 했지만 이제는 불필요합니다. 자세한 정보는 8 비트 및 10 비트 CLI 및 라이브러리 통합 을 참조하십시오.


젠장, 그게 일을 복잡하게 만듭니다. 따라서 두 x264 라이브러리에 연결된 두 개의 ffmpeg 바이너리가 필요합니다. 10 비트 x264의 정적 빌드가 어디에 있는지 알고 있습니까?
stib

여기 찾기 당신은 : download.videolan.org/pub/x264/binaries 은 설치와 Mingw, yasm, 자식과 GCC 및 주변 비료를 많이 invoving 대단히 긴 숨이 찬 과정이 스스로를 구축하려면 다음 doom10.org /index.php?topic=26.0 그러나 git을 허용하지 않는 바보 같은 회사 방화벽으로 인해 작동하지 못했습니다.
stib

아마도 Zeranoe 가 그러한 빌드를 제공하도록 할 수 있습니다 . 죄송합니다. Windows와 관련하여 상당히 쓸모가 없습니다.
llogan

나도 그게 문제 야 빌드 요청을 게시했는데 어떻게 진행되는지 보겠습니다.
stib

1
"모두가"나는 생각입니다 libx264 FWIW 요즘 ...
rogerdpack

6

편집 : 성공적으로 Ducks Take Off 의 10 비트 인코딩을 만들었습니다 .

첫 번째 방법 : libx264를 정적으로 연결하는 10 비트 x264 바이너리를 만들었습니다.

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

(품질 테스트가 아니라 개념 증명이므로 초고속 품질입니다.) swscale로 컴파일하지 않았습니다. (libavutil의 RGB pix fmt 또는 다른 것에 대해 불만이있었습니다). 입력 색상 공간이 일치하지 않으면 오류가 발생 --output-csp i444합니다. 실수로 x264에서 크로마를 다운 샘플링하지 않으려는 경우 실제로 좋습니다. 10 yuv444p14le.y4m비트 출력을 생성 하는 몇 프레임을 공급하면 정상적으로 작동했습니다 . 비트 심도를자를 수는 있지만 swscale 없이는 크로마를 다운 샘플링 할 수 없습니다.

두 번째 방법 : 10 LD_LIBRARY_PATH비트 libx264.so를 선택하는 데 사용

모든 것에 동일한 ffmpeg 동적 연결 바이너리를 사용할 수 있습니다.

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

나는 분명히 그 품질 설정으로 시각적으로 아무것도 보려고하지 않았습니다. 방금 빠르게 실행하기를 원했고 변형을 시도 할 때 항상 많은 출력 파일을 생성하기 때문에 많은 디스크 공간을 낭비하지 않았습니다.

방대한 y4m 데이터를 별도의 x264 프로세스로 파이핑하지 않으면 12 대신 14fps로 이동하므로 초고속으로 괜찮은 속도를 제공합니다. 인코딩이 느리면 오버 헤드가 줄어 듭니다.

내 소스는 48 비트 RGB입니다. exact_rnd가 출력 mkv에 영향을 미치지 않는다는 것을 알았습니다. ( mkv 헤더의 일부 비트를 제외하고 no -sws_flags, with -sws_flags +accurate_rnd및으로 비트 동일 결과 -vf scale=flags=accurate_rnd, 아마도 무작위 mkv UUID -qp 0cmp -l f1 f2 | less수 있습니다. 최초의 약간의 차이. 이후 같은 ssdeep -p. 아마 accurate_rnd기본 지금?)

ffmpeg가 크로마를 다운 샘플링하도록하는 경우 중요한 ffmpeg swscaler 플래그가 있습니다 : 기본 bicubic 대신 lanczos. (lanczos는 여전히 고품질을위한 최선의 선택이라고 생각합니다. 한동안 읽어 보지 않았습니다.)

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

에 추가 +lanczos-sws_flags작동하지 않습니다.

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

10 비트보다 깊은 입력을 공급하려고하면 ffmpeg가 거부합니다.

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

실제로, ffmpeg의 libx264 드라이버는 항상 컴파일 된 비트 깊이에 정확히 x264를 공급해야합니다. 예 -pix_fmt yuv420p:

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

x264.h의 말 :

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

내부적으로 x264 (CLI)는 항상 픽셀 형식을 상향 변환해야한다고 생각합니다. 코드에는 모든 기능의 8 비트 입력, 10 비트 출력 버전이 없습니다. 또한 다양한 입력 비트 깊이를 수용하는 것은 라이브러리 API가 아닌 x264 CLI에 있다고 생각 합니다. 더 높은 비트 세트가있는 곳에서 API 입력을 공급하면 어떤 일이 발생하는지 궁금합니다 ...

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

pix_fmt를 지정하지 않으면, ffmpeg는 yuv444p10leRGB 입력이 주어지면 선택 합니다. 또는를 사용 libx264rgb하면 16 비트 (10 개 중 상당)를 예상하는 함수 및 segfaults>. <에 8 비트 rgb를 공급합니다. 나는 그 업스트림을보고 갈 것입니다 ...

 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)

나는 그것을 업스트림에보고 할 것이다.

어쨌든, ffmpeg를위한 듀얼 비트 깊이 환경 또는 libx264, libx265 및 기타 높은 비트 깊이 컴파일 버전으로 실행하려는 다른 프로그램을 직접 구축하는 것은 꽤 대담한 것으로 나타났습니다. . (그래서 짧은 이름으로 "10 비트"가 아니라 "높이"라고했습니다.)

편집 끝 : 아래는 재 컴파일하지 않은 내 램 블링입니다. 그리고 win64 용 ffmpeg를 크로스 컴파일하는 방법에 대한 좋은 내용

x264에 높은 비트 심도 입력을 공급하려고 시도한 cmdline을 사용하지 않았으므로 직접 시도했습니다.

ffmpeg 픽셀 형식 이름 ( ffmpeg -pix_fmts)은 배열을 지정하는 것이 아니라 정확한 비트 배열로 매핑되므로 각 형식 + 비트 심도 콤보의 이름이 다릅니다. -pix_fmt yuv422p"내 입력과 같은 비트 심도로 422로 변환"을 의미 한다고 생각했습니다 .

Wikipedia에 따르면 h.264는 Hi444PP에서만 8-14 비트 심도를 지원하고 다른 것은 최대 10 비트에 불과하다고합니다. Hi444PP는 x264가 -qp 0또는에 사용하는 예측 무손실 코딩을 지원하는 유일한 프로필입니다 -crf 0. 편집 : AFAICT, x264는 여전히 8, 9 또는 10 비트 용 컴파일 만 지원합니다.

어쨌든 로컬 x264를 다시 컴파일하지 않았기 때문에 작동하지 않는 명령의 쓸모없는 출력이 있습니다. (하지만 재 컴파일 된 x264와 함께 작동해야합니다. 직접 연주하고 싶다면이 답변을 편집 할 수 있습니다.)

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'줄을 참고하십시오 .

아마도 나는 필요하지 않았 -profile으며, 높은 비트 깊이의 x264를 사용하면 작동합니다. (그리고 잠재적으로 444 10 비트를 선택하면 ffmpeg가 호출합니다 yuva444p10le.) 나는 높은 비트 심도 x264가 수용 할 수 있다고 생각yuv444p14le 하지만 여전히 10 비트 h.264 만 생성합니다. cmdline x264 --fullhelp은 8에서 10까지의 출력 비트 깊이에 대해 매우 명백합니다. 이상한 -profile high10아무것도하지 않고 8 비트 x264에 의해 무시됩니다.

내부적으로 높은 비트 심도로 컴파일 된 x264는 10 비트 데이터를 저장하는 데 16bpp를 사용하므로 16 비트 값으로 모션 검색 등을 수행 할 수 있습니다. 6 비트를 무시하여 속도를 얻지 않는 한 DCT는 10 비트가 아닌 16 비트보다 높을 수 있습니다. 이것은 DCT 전에 10 비트로 내림 한 경우와 약간 다른 DCT 계수를 생성 할 수 있습니다. (따라서 x264에 공급하기 전에 10 비트로 변환하여 12, 14 또는 16 비트를 제공하는 것과는 다른 출력을 얻을 수 있습니다.) 그래도 코드를 보거나 시도하기 전에 시도하십시오. 이 단락을 신뢰하지 마십시오. :피

(편집 : ffmpeg는 x264-10bit를 구성 요소 당 10bit 이상 공급하지 않습니다. swscale을 사용하여 비트 깊이 자체를 줄입니다.)

높은 수준의 깊이로 컴파일 할 때 전역 변수와 API 함수에 다른 이름을 사용하도록 x264와 x265를 패치하는 것이 얼마나 어려운지 궁금합니다. 그런 다음 두 버전을 한 번에 빌드하고 두 버전에 ffmpeg를 연결할 수 있습니다. ffmpeg libx264libx264rgb랩퍼는 입력 스트림에 따라 적절한 버전의 API 호출을 처리 할 수 ​​있습니다. (그렇지 않으면 필요할 것 -c:v libx264-deep또는 libx264rgb-deepFFmpeg에 4 가지 x264 "코덱"총.)

Windows 용 ffmpeg를 크로스 컴파일하는 방법

편집 : Windows의 LD_LIBRARY_PATH경우 libx264 DLL 만큼 편리한 것이 없다고 생각 하므로 최선의 방법은 여전히 ​​높은 비트 심도 정적 바이너리와 일반적인 사용을위한 것입니다. 고음질 libx264는 보통 깊이 h.264를 출력 할 수 없습니다. 속도 페널티뿐만 아니라 할 수 없습니다.

Windows 용 자체 ffmpeg (정적 바이너리)를 컴파일하는 가장 쉬운 방법은 https://github.com/rdp/ffmpeg-windows-build-helpers 입니다. Linux 컴퓨터 (또는 OS X와 ​​같은 작동하는 gcc가있는 다른 시스템)에서 repo를 git clone 한 다음 실행하십시오.

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

처음 실행하는 데 약 8 시간이 걸렸습니다. 소스에서 mingw-cross-compile GCC를 빌드하고 다른 모든 것을 포함했기 때문입니다. (gcc는 원래 나쁜 컴파일러로 컴파일하는 경우 부트 스트랩으로 여러 번 자체 재구성합니다.)

로 빌드 스크립트를 업데이트 git pull하고 다시 실행하면 ffmpeg, x264, x265 및 소스에서 컴파일하는 다른 프로젝트의 최신 git 업데이트를 가져옵니다. 대부분의 경우 tarball을 다운로드합니다.

내 리눅스 데스크탑은 시대를 보이고 있습니다. 나는 주로 게임에 사용하는 wintendo가 있습니다. 비디오 인코딩으로 혼란을 시작한 이후 쿼드 코어 Sandybridge가 esp에도 매우 유용하다는 것을 알았습니다. x265의 경우. 아마도 x265의 일부 기능에는 AVX / SSE4 용 asm 버전 만있을 수 있으므로 SSSE3 Linux 시스템 (Conroe)에서 C로 돌아갑니다. 또는 1fps에서 더 눈에 띄는 것입니다 ...


편집 할 때 stackexchange가 사람들에게 통지합니까? 그렇지 않은 경우 코멘트를 게시합니다.
Peter Cordes

이것은 동적 연결이 사용되는 OS X에서 훨씬 간단합니다. 간단하게 brew reinstall x264 --with-10-bit작업을 완료하고,는 FFmpeg는 새로운 x264 맛 : 사용
표시 이름

1
@SargeBorsch :이 답변의 요점은 두 가지 특징을 모두 같은 시간에 설치하는 것이므로 라이브러리를 다시 설치하지 않고도 8 비트와 10 비트를 비교할 수 있습니다. OS X 동적 연결은 Linux와 거의 동일하게 작동하며, 원하는 경우 libx264 설치를 다른 버전으로 대체 할 수 있습니다.
Peter Cordes

@PeterCordes 흠, 내 나쁜. 맞습니다
표시 이름

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.