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 문서 I find :
--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
옵션은 있지만 출력 비트 심도에 대한 것은 없습니다.
댓글
- 찾았습니다. x264.nl/x264/10bit_02-ateme-why_does_10bit_save_bandwidth.pdf 분명히 10 비트를 사용하면 압축 효율성 (크기 대 품질)이 향상됩니다. 인코딩 속도가 그리 느리지 않으면 ' 10 비트를 정기적으로 사용하기 시작할 수 있습니다.
답변
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
를 입력 한 다음 ffmpeg
를 8 비트 또는 10 비트 libx264에 연결하지만 이제는 불필요합니다. 자세한 내용은 8 비트 및 10 비트 CLI 및 라이브러리 통합 을 참조하세요.
댓글
- 젠장! 연루. 따라서 ' 2 개의 x264 라이브러리에 연결된 2 개의 ffmpeg 바이너리가 필요합니다. 10 비트 x264의 정적 빌드가 어디에 있는지 알고 있습니까?
- 여기에서 찾을 수 있습니다. download.videolan.org/pub/x264/binaries 직접 빌드하려면 mingw, yasm, git 및 gcc를 설치하고 여기에서 많은 작업을 수행하는 매우 긴 과정이 필요합니다. doom10.org/ index.php? topic = 26.0 하지만 ' 주로이긴 멍청한 회사 방화벽으로 인해 ' 작동하지 못했습니다. ' git 허용하지 않습니다.
- Zeranoe 를 통해 이러한 빌드를 제공 할 수 있습니다. 죄송합니다. 저는 ' Windows와 관련하여 상당히 쓸모가 없습니다.
- 나도 마찬가지입니다. ' 문제. 저는 ' 빌드 요청을 게시했습니다. ' 어떻게 진행되는지 살펴 보겠습니다.
- 요즘 libx264는 " 둘 다 " 믿습니다 …
답변
수정 : 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로 다운 샘플링하지 않으려면 실제로 좋습니다. 몇 프레임의 yuv444p14le.y4m
를 공급했을 때 잘 작동하여 10 비트 출력을 생성했습니다. (비트 심도를자를 수 있지만 swscale없이 채도를 다운 샘플링 할 수는 없습니다.)
두 번째 방법 : LD_LIBRARY_PATH
를 사용하여 10 비트 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입니다. 정확한 _rnd가 출력 mkv에 영향을 미치지 않는다는 것을 발견했습니다 (-sws_flags
, -sws_flags +accurate_rnd
및 -vf scale=flags=accurate_rnd
를 사용합니다. mkv 헤더의 몇 비트를 제외하고는 아마도 무작위 mkv UUID 일 것입니다. -qp 0
이므로 반올림 오류로 인해 손실되지 않았습니다. cmp -l f1 f2 | less
를 사용하여 초기 차이 후에 동일 할 수있는 바이너리 파일을 비교합니다.또는 ssdeep -p
. 지금은 accurate_rnd
가 기본값일까요?)
ffmpeg가 크로마를 다운 샘플링하도록 허용하는 경우 중요한 ffmpeg swscaler 플래그가 있습니다. 기본값 대신 lanczos bicubic. (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 입력을 공급하면 어떻게되는지 궁금합니다. (ffpeg는 코드를 해킹하지 않고는이 작업을 수행하는 것을 허용하지 않습니다. 따라서 이것은 누구나 피할 필요가없는 일입니다.)
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는 rgb 입력이 주어질 때 yuv444p10le
를 선택합니다. 또는 libx264rgb
, 16 비트 (이 중 10 개가 중요 함)를 예상하는 함수에 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의 높은 비트 수준으로 컴파일 된 버전 및 기타 원하는 다른 프로그램으로 실행하려는 기타 프로그램을위한 이중 비트 수준 환경입니다. (그래서 내가 “highdepth”라고 부르지 않았습니다. 더 짧은 이름의 경우 “10bit”입니다.)
편집 끝 : 아래는 재 컴파일하지 않은 내 엉망진창입니다. 그리고 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"
줄을 참고하세요.
아마도 및 높은 비트 심도 x264를 사용하면 제대로 작동합니다. (그리고 ffmpeg가 yuva444p10le
라고 부르는 444 10 비트를 선택할 수 있습니다.) 높은 비트 심도 x264가 yuv444p14le
div를 허용 할 수 있다고 생각합니다 . >, 그러나 여전히 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 비트를 제공하는 것입니다.) 그래도 코드를 살펴 보거나 구성하기 전에 시도해야합니다.이 단락을 신뢰하지 마십시오. : P
(편집 : ffmpeg는 구성 요소 당 10 비트를 초과하는 x264-10 비트를 공급하지 않습니다. swscale을 사용하여 비트 심도 자체를 줄입니다.)
얼마나 어려운지 궁금합니다. 높은 비트 심도를 위해 컴파일 할 때 전역 변수와 API 함수에 대해 다른 이름을 사용하도록 x264 및 x265를 패치하는 것입니다. 그런 다음 두 버전을 한 번에 빌드하고 두 버전 모두에 대해 ffmpeg를 연결할 수 있습니다. ffmpeg libx264
및 libx264rgb
래퍼는 입력 스트림에 따라 적절한 버전의 API 호출을 처리 할 수 있습니다.(그렇지 않으면 ffmpeg에서 총 4 개의 서로 다른 x264 “코덱”에 대해 -c:v libx264-deep
또는 libx264rgb-deep
가 필요합니다.)
Windows 용 ffmpeg 크로스 컴파일 방법
편집 : Windows의 경우 libx264 DLL의 경우 LD_LIBRARY_PATH
만큼 편리한 것이 없다고 생각합니다. , 따라서 가장 좋은 방법은 여전히 높은 비트 깊이의 정적 바이너리를 만들고 일반적인 사용을위한 또 다른 바이너리를 빌드하는 것입니다. 높은 깊이의 libx264 CAN “T는 일반 깊이 h.264를 출력합니다. 속도 저하뿐만 아니라 그럴 수도 없습니다.
Windows 용 ffmpeg (정적 바이너리)를 컴파일하는 가장 쉬운 방법은
. git는 Linux 시스템 (또는 OS X와 같이 작동하는 gcc가있는 다른 시스템)에서 저장소를 복제 한 다음 실행
./cross_compile_ffmpeg.sh --high-bitdepth=y --disable-nonfree=n --build-choice=win64
다른 모든 것과 함께 소스에서 mingw-cross-compile GCC를 빌드했기 때문에 처음 실행하는 데 약 8 시간이 걸렸습니다. (gcc는 기본적으로 여러 원래 잘못된 컴파일러로 컴파일 한 경우 부트 스트랩에 시간이 걸립니다.)
git pull
로 빌드 스크립트를 업데이트 할 수 있으며 다시 실행하면 ffmpeg, x264, x265 및 소스에서 컴파일하는 다른 프로젝트에 대한 최신 git 업데이트를 가져옵니다. (대부분의 경우 타르볼 만 다운로드합니다.)
내 Linux 데스크톱이 그 나이를 보여주고 있습니다. 주로 게임에 사용하는 wintendo입니다. 비디오 인코딩을 엉망으로 만들기 시작한 이후로 쿼드 코어 Sandybrid를 발견했습니다. ge도 꽤 유용합니다. x265의 경우. 아마도 x265 “의 일부 기능은 AVX / SSE4 용 asm 버전 만 가지고있을 것입니다. 그래서 그것은”내 SSSE3 Linux 시스템 (Conroe)에서 C로 돌아갑니다. ” 그게 아니면 1fps에서 더 눈에 띕니다 …
댓글
- 편집 할 때 stackexchange가 사람들에게 알림을 보내나요? '하지 않습니다.
- 동적 연결이 사용되는 OS X에서는 훨씬 간단합니다. 간단히
brew reinstall x264 --with-10-bit
완료되면 ffmpeg는 새로운 x264 플레이버를 사용합니다. 🙂 - @SargeBorsch :이 대답의 요점은 두 가지 플레이버를 동시에 설치하는 것이었기 때문에 다시 설치하지 않고도 8 비트와 10 비트를 비교할 수 있습니다. OS X 동적 연결은 Linux '와 거의 동일하게 작동하며, 원하는 경우 libx264 설치를 다른 버전으로 유사하게 대체 할 수 있습니다.
- @PeterCordes 흠, 내 말이 맞습니다.
Answer
https://sourceforge.net/projects/ffmpeg-hi/?source=typ_redirect
아래 명령을 입력하여 4 : 2 : 2 1 0 비트 h.264 파일 :
ffmpeg-hi10-heaac.exe -i "im.mp4" -c:v libx264 -pix_fmt yuv422p10le yuv-high-.ts