편집 : 성공적으로 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 0
일 cmp -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는 yuv444p10le
RGB 입력이 주어지면 선택 합니다. 또는를 사용 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 libx264
및 libx264rgb
랩퍼는 입력 스트림에 따라 적절한 버전의 API 호출을 처리 할 수 있습니다. (그렇지 않으면 필요할 것 -c:v libx264-deep
또는 libx264rgb-deep
FFmpeg에 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에서 더 눈에 띄는 것입니다 ...