В свете реально появившихся фильмов размера 4К (или 2160р) в узких кругах киноманов время от времени возникает вопрос о перекодировке 4К 4:2:0 в Full HD (1080р) 4:4:4 с целью получения максимально возможной отдачи от устаревающих FHD ТВ типа панасониковской плазмы.
К счастью для киноманов, не столь давно на одном из забугорных форумов некий товарищ именем
karl предложил остроумный способ подобной перегонки буквально на коленке при помощи
ffmpeg:
http://www.personal-view.com/talks/discussion/10637/…progress-topic/p2Вкратце, оный товарищ предлагает следующий алгоритм:
1) извлекаем из 2160р YUV-кадра U- и V-компоненты
2) масштабируем извлеченные U- и V-компоненты до исходного размера 2160р
3) сливаем масштабированные U- и V-компоненты с исходной Y-компонентой
4) делаем даунскейл результата до 1080p
5) кодируем даунскейленное во что-нибудь в формате 4:4:4.
По вышеуказанной ссылке находится предложенный товарищем Карлом шелл-скрипт для перекодировки какого-то 2160р в 1080р аппловским кодеком ProRes формате 10 бит 4:4:4.
С целью практической проверки оного алгоритма был избран подопытный семпл из 4K-кина
Элизиум. Для простоты из подопытного с помощью MkvMerge были извлечены звуковые дороги, тэги и проч., остался только видеопоток
http://sendfile.su/1170814Медиа-инфа подопытного
Complete name : 4k420.mkv
Format : Matroska
Format version : Version 4 / Version 2
File size : 346 MiB
Duration : 1mn 7s
Overall bit rate : 42.7 Mbps
Encoded date : UTC 2015-11-03 17:07:37
Writing application : mkvmerge v6.6.0 ('The Edge Of The In Between') built on Sep 6 2015 20:55:58
Writing library : libebml v1.3.3 + libmatroska v1.4.4
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L5.2
Format settings, CABAC : Yes
Format settings, ReFrames : 7 frames
Codec ID : V_MPEG4/ISO/AVC
Duration : 1mn 7s
Bit rate : 41.9 Mbps
Width : 3 840 pixels
Height : 1 606 pixels
Display aspect ratio : 2.40:1
Frame rate mode : Constant
Frame rate : 23.976 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.283
Stream size : 339 MiB (98%)
Language : English
Default : Yes
Forced : Yes
Matrix coefficients : BT.709
Предложенный тов. Карлом шелл-скрипт был немного доработан напильником под особенности конкретного подопытного:
ffmpeg -i 4k420.mkv -filter_complex 'extractplanes=y+u+v[y][u][v];
[u] scale=w=3840:h=1606:flags=print_info+neighbor+bitexact [us];
[v] scale=w=3840:h=1606:flags=print_info+neighbor+bitexact [vs];
[y][us][vs]mergeplanes=0x001020:yuv444p,format=pix_fmts=yuv444p, scale=w=1920:-1:flags=print_info+bicubic+full_chroma_inp+full_chroma_int'
-sws_dither none -c:v libx264 -preset veryslow -profile:v high444 -level 4.1 -map 0 2k444.mkv
(это всё одна длинная команда)
В результате применения модифицированной команды к подопытному получился некий результат:
http://sendfile.su/1170818Выхлоп команды:
ffmpeg version 2.6.3 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.9.3 (Gentoo 4.9.3 p1.2, pie-0.6.3)
configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --optflags=' ' --disable-static --enable-avfilter --enable-avresample --disable-stripping --enable-version3 --disable-indev=v4l2 --disable-outdev=v4l2 --disable-indev=oss --disable-indev=jack --disable-outdev=oss --disable-outdev=sdl --enable-bzlib --disable-runtime-cpudetect --disable-debug --disable-doc --disable-gnutls --enable-gpl --enable-hardcoded-tables --enable-iconv --disable-lzma --enable-network --disable-openssl --enable-postproc --disable-libsmbclient --disable-ffplay --disable-vaapi --enable-vdpau --enable-xlib --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --enable-zlib --disable-libcdio --disable-libiec61883 --disable-libdc1394 --disable-libcaca --disable-openal --disable-opengl --disable-libv4l2 --disable-libpulse --disable-libopencore-amrwb --disable-libopencore-amrnb --disable-libfdk-aac --disable-libopenjpeg --disable-libbluray --disable-libcelt --disable-libgme --disable-libgsm --disable-libmodplug --disable-libopus --disable-libquvi --disable-librtmp --disable-libssh --disable-libschroedinger --disable-libspeex --disable-libvorbis --disable-libvpx --disable-libzvbi --disable-libbs2b --disable-libflite --disable-frei0r --disable-libfribidi --disable-fontconfig --disable-ladspa --disable-libass --enable-libfreetype --disable-libsoxr --enable-pthreads --enable-libvo-aacenc --disable-libvo-amrwbenc --disable-libmp3lame --disable-libaacplus --disable-libfaac --disable-libtheora --disable-libtwolame --disable-libwavpack --disable-libwebp --enable-libx264 --disable-libx265 --enable-libxvid --enable-x11grab --disable-amd3dnow --disable-amd3dnowext --disable-avx2 --disable-fma3 --disable-fma4 --disable-xop --cpu=host
libavutil 54. 20.100 / 54. 20.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 25.101 / 56. 25.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.102 / 5. 11.102
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, matroska,webm, from '/tmp/4k420.mkv':
Metadata:
encoder : libebml v1.3.3 + libmatroska v1.4.4
creation_time : 2015-11-03 17:07:37
Duration: 00:01:07.99, start: 0.000000, bitrate: 42707 kb/s
Stream #0:0(eng): Video: h264 (High), yuv420p(tv, bt709/unknown/unknown), 3840x1606, SAR 1:1 DAR 1920:803, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default) (forced)
Please use -profile:a or -profile:v, -profile is ambiguous
[swscaler @ 0x1c880c0] nearest neighbor / point scaler, from gray to gray using MMXEXT
[swscaler @ 0x1d72cc0] nearest neighbor / point scaler, from gray to gray using MMXEXT
[swscaler @ 0x1d9fac0] bicubic scaler, from yuv444p to yuv444p using MMXEXT
No pixel format specified, yuv444p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 0x1d4d5e0] using SAR=1/1
[libx264 @ 0x1d4d5e0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x1d4d5e0] profile High 4:4:4 Predictive, level 4.1, 4:4:4 8-bit
[libx264 @ 0x1d4d5e0] 264 - core 142 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=5 deblock=1:0:0 analyse=0x3:0x133 me=umh subme=10 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=24 chroma_me=1 trellis=2 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=8 b_pyramid=2 b_adapt=2 b_bias=0 direct=3 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=23 scenecut=40 intra_refresh=0 rc_lookahead=60 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 '/tmp/2k444.mkv':
Metadata:
encoder : Lavf56.25.101
Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), yuv444p, 1920x803 [SAR 1:1 DAR 1920:803], q=-1--1, 23.98 fps, 1k tbn, 23.98 tbc (default) (forced)
Metadata:
encoder : Lavc56.26.100 libx264
Stream mapping:
Stream #0:0 (h264) -> extractplanes
scale -> Stream #0:0 (libx264)
Press [q] to stop, [?] for help
frame= 1630 fps=9.3 q=-1.0 Lsize= 14993kB time=00:01:07.90 bitrate=1808.8kbits/s
video:14980kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.083560%
[libx264 @ 0x1d4d5e0] frame I:10 Avg QP:21.32 size: 57177
[libx264 @ 0x1d4d5e0] frame P:397 Avg QP:25.56 size: 19166
[libx264 @ 0x1d4d5e0] frame B:1223 Avg QP:27.80 size: 5853
[libx264 @ 0x1d4d5e0] consecutive B-frames: 3.9% 4.8% 7.2% 22.3% 16.3% 41.6% 3.0% 1.0% 0.0%
[libx264 @ 0x1d4d5e0] mb I I16..4: 24.0% 69.1% 7.0%
[libx264 @ 0x1d4d5e0] mb P I16..4: 11.6% 15.1% 0.7% P16..4: 36.6% 5.7% 5.8% 0.0% 0.0% skip:24.6%
[libx264 @ 0x1d4d5e0] mb B I16..4: 0.4% 0.9% 0.0% B16..8: 38.0% 3.1% 0.6% direct: 1.1% skip:55.8% L0:43.4% L1:54.4% BI: 2.3%
[libx264 @ 0x1d4d5e0] 8x8 transform intra:57.6% inter:85.9%
[libx264 @ 0x1d4d5e0] direct mvs spatial:99.3% temporal:0.7%
[libx264 @ 0x1d4d5e0] coded y,u,v intra: 39.1% 7.6% 7.7% inter: 4.7% 0.5% 0.5%
[libx264 @ 0x1d4d5e0] i16 v,h,dc,p: 20% 14% 8% 58%
[libx264 @ 0x1d4d5e0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 12% 7% 3% 9% 15% 16% 15% 12% 11%
[libx264 @ 0x1d4d5e0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 16% 8% 3% 9% 15% 16% 14% 10% 10%
[libx264 @ 0x1d4d5e0] Weighted P-Frames: Y:0.3% UV:0.3%
[libx264 @ 0x1d4d5e0] ref P L0: 57.9% 11.2% 16.7% 7.9% 5.7% 0.6% 0.0%
[libx264 @ 0x1d4d5e0] ref B L0: 86.4% 9.7% 3.1% 0.8%
[libx264 @ 0x1d4d5e0] ref B L1: 94.5% 5.5%
[libx264 @ 0x1d4d5e0] kb/s:1805.02
Медиа-инфа результата:
Complete name : 2k444.mkv
Format : Matroska
Format version : Version 4 / Version 2
File size : 14.6 MiB
Duration : 1mn 7s
Overall bit rate : 1 807 Kbps
Writing application : Lavf56.25.101
Writing library : Lavf56.25.101
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High 4:4:4 Predictive@L4.1
Format settings, CABAC : Yes
Format settings, ReFrames : 5 frames
Codec ID : V_MPEG4/ISO/AVC
Duration : 1mn 7s
Bit rate : 1 771 Kbps
Width : 1 920 pixels
Height : 803 pixels
Display aspect ratio : 2.40:1
Frame rate mode : Constant
Frame rate : 23.976 fps
Color space : YUV
Chroma subsampling : 4:4:4
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.048
Stream size : 14.4 MiB (98%)
Writing library : x264 core 142
Encoding settings : cabac=1 / ref=5 / deblock=1:0:0 / analyse=0x3:0x133 / me=umh / subme=10 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=24 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=4 / threads=12 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=8 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc_lookahead=60 / rc=crf / mbtree=1 / crf=23.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00
Default : Yes
Forced : Yes
Положительный результат состоит в том, что в итоге получается смотрибельный видеофайл, и возможно, даже в формате 4:4:4.
Отрицательный результат в том, что ни YUV444P, ни 10 бит, похоже, не поддерживаются VDPAU и железными плеерами, т.е. смотреть итоговое можно только софтварно с компа.
Безусловно, алгоритм нуждается в дальнейшей обработке напильником.
Желающие приглашаются к тестированию и проч.
Всё.
UPD. Сравнение скринов:
2К 444
http://imgur.com/eSvN9M4K 420
http://imgur.com/52065EgОбои
http://imgur.com/a/1UIV3Исправлено: alnash, 03.11.2015 23:44