Beim Herunterskalieren von 4K YUV420 auf 1080p YUV444 mit ffmpeg wird ein roter Farbton eingeführt

Ich verkleinere 4K YUV420-Videos von der Panasonic LX100 auf Full HD YUV444 mit der ffmpeg-Konsole in Windows und einem Skript, das von Benutzer karl im Personal View-Forum bereitgestellt und für die Ausgabe von H265-Videos mit konstantem Ratenfaktor 18 modifiziert wurde:

ffmpeg -i "input_path.MP4" -filter_complex "extractplanes=y+u+v[y][u][v]; [u] scale=w=3840:h=2160:flags=print_info+neighbor+bitexact [us]; [v] scale=w=3840:h=2160:flags=print_info+neighbor+bitexact [vs]; [y][us][vs]mergeplanes=0x001020:yuv444p,format=pix_fmts=yuv444p10le,scale=w=1920:h=1080:flags=print_info+bicubic+full_chroma_inp+full_chroma_int" -sws_dither none  -c:v libx265 -preset medium -crf 18 -c:a copy  -c:s copy -c:d copy  -map 0 "output_path.mp4"

Das Ergebnis, sagt mir VLC, ist ein 1080p yuv444-Video, und ich kann eine ausgezeichnete Farbauflösung sehen, soweit so gut. Allerdings hat das Bild gegenüber dem Original einen leichten Rotstich.

Was könnte das verursachen?

Die vollständige Konsolenausgabe lautet:

ffmpeg -i "input.MP4" -filter_complex "extractplanes=y+u+v[y][u][v]; [u] scale=w=3840:h=2160:flags=print_info+neighbor+bitexact [us]; [v] scale=w=3840:h=2160:flags=print_info+neighbor+bitexact [vs]; [y
][us][vs]mergeplanes=0x001020:yuv444p,format=pix_fmts=yuv444p10le,scale=w=1920:h
=1080:flags=print_info+bicubic+full_chroma_inp+full_chroma_int" -sws_dither none
  -c:v libx265 -preset medium -crf 18 -c:a copy  -c:s copy -c:d copy  -map 0 "output.mp4"
ffmpeg version N-82080-g6969bed Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dx
va2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-lib
ebur128 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --ena
ble-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfree
type --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enab
le-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-lib
openh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschr
oedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheor
a --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvo
rbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --ena
ble-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --e
nable-decklink --enable-zlib
  libavutil      55. 32.100 / 55. 32.100
  libavcodec     57. 63.103 / 57. 63.103
  libavformat    57. 53.100 / 57. 53.100
  libavdevice    57.  0.103 / 57.  0.103
  libavfilter     6. 64.100 /  6. 64.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  2.100 /  2.  2.100
  libpostproc    54.  0.100 / 54.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.MP4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-06-27T21:42:33.000000Z
  Duration: 00:00:16.02, start: 0.000000, bitrate: 95327 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709)
, 3840x2160 [SAR 1:1 DAR 16:9], 95071 kb/s, 23.98 fps, 23.98 tbr, 360k tbn, 47.9
5 tbc (default)
    Metadata:
      creation_time   : 2015-06-27T21:42:33.000000Z
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, flt
p, 124 kb/s (default)
    Metadata:
      creation_time   : 2015-06-27T21:42:33.000000Z
File 'output.mp4' already exists. Overwrite ? [y/N] y
[swscaler @ 00000000041193c0] nearest neighbor / point scaler, from gray to gray
 using MMXEXT
[swscaler @ 0000000000556720] nearest neighbor / point scaler, from gray to gray
 using MMXEXT
[swscaler @ 000000000418cd60] bicubic scaler, from yuv444p10le to yuv444p using
MMXEXT
x265 [info]: HEVC encoder version 0.0
x265 [info]: build info [Windows][GCC 5.4.0][64 bit] 8bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
x265 [info]: Main 4:4:4 profile, Level-4 (Main tier)
x265 [info]: Thread pool created using 4 threads
x265 [info]: Slices                              : 1
x265 [info]: frame threads / pool features       : 2 / wpp(17 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge         : hex / 57 / 2 / 2
x265 [info]: Keyframe min / max / scenecut       : 23 / 250 / 40
x265 [info]: Cb/Cr QP Offset                     : 6 / 6
x265 [info]: Lookahead / bframes / badapt        : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb       : 1 / 1 / 0
x265 [info]: References / ref-limit  cu / depth  : 3 / on / on
x265 [info]: AQ: mode / str / qg-size / cu-tree  : 1 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress            : CRF-18.0 / 0.60
x265 [info]: tools: rd=3 psy-rd=2.00 rskip signhide tmvp strong-intra-smoothing
x265 [info]: tools: lslices=6 deblock sao
Output #0, mp4, to 'G:\darrask\Pics\2015.06 Goettingen\P1340763_karl3.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    encoder         : Lavf57.53.100
    Stream #0:0: Video: hevc (libx265) ([35][0][0][0] / 0x0023), yuv444p, 1920x1
080 [SAR 1:1 DAR 16:9], q=2-31, 23.98 fps, 24k tbn, 23.98 tbc (default)
    Metadata:
      encoder         : Lavc57.63.103 libx265
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, 124 kb/s (default)
    Metadata:
      creation_time   : 2015-06-27T21:42:33.000000Z
Stream mapping:
  Stream #0:0 (h264) -> extractplanes
  scale -> Stream #0:0 (libx265)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[swscaler @ 00000000041b9da0] bicubic scaler, from yuv444p10le to yuv444p using MMXEXT
frame=    7 fps=0.0 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A speed=
frame=   17 fps= 16 q=0.0 size=       0kB time=00:00:00.49 bitrate=   0.7kbits/s
frame=   25 fps= 16 q=0.0 size=       0kB time=00:00:00.98 bitrate=   0.4kbits/s
frame=   29 fps= 14 q=-0.0 size=      61kB time=00:00:00.98 bitrate= 508.0kbits/
frame=   30 fps= 11 q=-0.0 size=      95kB time=00:00:00.98 bitrate= 795.6kbits/
frame=   31 fps=9.7 q=-0.0 size=     112kB time=00:00:01.00 bitrate= 918.1kbits/
...console output truncated by user...
frame=  377 fps=3.9 q=-0.0 size=    7017kB time=00:00:15.50 bitrate=3706.4kbits/
frame=  379 fps=3.9 q=-0.0 size=    7048kB time=00:00:15.53 bitrate=3717.4kbits/
frame=  383 fps=3.9 q=-0.0 size=    7131kB time=00:00:16.00 bitrate=3650.8kbits/
frame=  384 fps=3.7 q=-0.0 Lsize=    7561kB time=00:00:16.00 bitrate=3871.5kbits
/s speed=0.156x
video:7304kB audio:244kB subtitle:0kB other streams:0kB global headers:1kB muxin
g overhead: 0.169810%
x265 [info]: frame I:      2, Avg QP:18.71  kb/s: 16117.16
x265 [info]: frame P:     86, Avg QP:19.53  kb/s: 8568.68
x265 [info]: frame B:    296, Avg QP:23.40  kb/s: 2247.32
x265 [info]: Weighted P-Frames: Y:0.0% UV:0.0%
x265 [info]: consecutive B-frames: 2.3% 0.0% 9.1% 36.4% 52.3%

encoded 384 frames in 102.81s (3.73 fps), 3735.28 kb/s, Avg QP:22.51

output_path
>

Beachten Sie, dass es auch einen roten Farbton hat, wenn ich mit dem Originalskript von Karl nach Prores exportiere, und auch wenn pix_fmts=yuv444p10le nicht verwendet wird (daher gehe ich davon aus, dass 8 Bit pro Pixel verwendet werden).

Zeigt die vollständige Konsolenausgabe an.
Fertig und bearbeitet.

Antworten (2)

Ich habe weiter gegraben und nachdem ich das gesamte Thema bei Personal View gelesen hatte, fand ich heraus, dass der Benutzer willyfanin_range=full vorschlug , beide ersten Argumente hinzuzufügen , scaleum eine Farbverschiebung zu korrigieren, die er ebenfalls beobachtete. Und es funktioniert. Hier ist also der vollständige ffmpeg-Code, angepasst an Karls Skript, für Windows:

ffmpeg -i "input.MP4" -filter_complex "extractplanes=y+u+v[y][u][v]; [u] scale=w=3840:h=2160:in_range=full:flags=print_info+neighbor+bitexact [us]; [v] scale=w=3840:h=2160:in_range=full:flags=print_info+neighbor+bitexact [vs]; [y][us][vs]mergeplanes=0x001020:yuv444p,format=pix_fmts=yuv444p10le,scale=w=1920:h=1080:flags=print_info+bicubic+full_chroma_inp+full_chroma_int" -sws_dither none  -c:v libx265 -preset medium -crf 18 -c:a copy  -c:s copy -c:d copy  -map 0 "output.mp4"

Es scheint also, dass dies ein gut funktionierendes Skript zum Konvertieren von 4K YUV420-Material in 1080p YUV444-Material mit erstaunlichen Ergebnissen ist! Meine Dateien sind 5-10% der Originalgröße und haben unglaublich wenig Qualitätsverlust.

PS: Beachten Sie, dass Benutzer Karl sagt:

Aber wenn Sie "in_rage=full:out_range=full" verwenden, sollte das mit Material im Wertebereich von 0-255 in Ordnung sein. [...] Sie könnten versuchen, "in_range=full:out_range=mpeg" zu verwenden und sehen, ob das hilft.

hm? Ich würde jetzt einfach ffmpeg v4.x verwenden und einfach einen Befehl wie ffmpeg -i "infile" -c:v libx265 -pix_fmt yuv444p -crf 18 "outfile" verwenden.

das ist nicht nötig. Wir müssen von 4K YUK420 auf 1080p YUV444 gehen und dies wird nicht einmal herunterskaliert.