Konten

Encoding: 4:4:4 Chroma Subsampling

Lebih baik atau tidak?

Diubah pada: 2021-02-20

insert another generic intro here

Yang dibutuhin:

  • PC
  • Vapoursynth dan segalanyas
  • x264

Silakan cek tutorial install ini: https://gist.github.com/noaione/6f8583c32a8f23e367688ebac0c9d0e0

4:4:4 Chroma Subsampling dah menjadi hal normal di Fansub luar negeri. Cuma di Indonesia masih belum normal ya…

Di postingan ini, akan tak kasitau beberapa advantage dari 4:4:4 chroma 10 bit di banding 4:2:0 chroma 10bit

Ukuran/Resolusi Plane

Sesuai namanya, 4:4:4 chroma membagi semua plane (Y:U:V) menjadi sama rata (cue the soviet anthem) dibanding 4:2:0.

Sekilasnya, 4:4:4 menjadikan resolusi per-plane menjadi sama, misal 720p menjadi 720p semua, sedangkan 4:2:0 resolusi per-plane menjadi 720p/360p/360p.

Jadi kalau pake 4:2:0 alhasil chroma plane (U & V) akan di upscale ke 720p.

U Plane

/assets/img/meme444/u420-360p.png
4:2:0 U Plane (360p)
/assets/img/meme444/u444-720p.png
4:4:4 U Plane (720p)

V Plane

/assets/img/meme444/v420-360p.png
4:2:0 V Plane (360p)
/assets/img/meme444/v444-720p.png
4:4:4 V Plane (720p)

Warna lebih detail

Warna lebih detail 4:4:4 walaupun tidak seberapa, perbandingan tak sediakan di bawah.

U Plane

/assets/img/meme444/u420-stats.png
4:2:0 U Plane
/assets/img/meme444/u444-stats.png
4:4:4 U Plane

V Plane

/assets/img/meme444/v420-stats.png
4:2:0 V Plane
/assets/img/meme444/v444-stats.png
4:4:4 V Plane

Kalau liat gambarnya, PlaneStatsMin menjadi lebih rendah di 4:4:4 dan PlaneStatsMax lebih tinggi di 4:4:4, Average hanyalah rata-rata atau median dari Min/Max frame tersebut.

Untuk plane Chroma (U&V) saja, untuk plane Luma (Y) sama saja.

Size

Size mungkin bervariasi pada encode masing-masing, cuma dengan melakukan test encode, size 4:4:4 lebih kecil ~4mb dibanding 4:2:0 tetapi speed encode lebih lambat ~1.5fps

Berikut settingan encodenya, perubahan hanya terdapat pada --output-csp, --profile dan --8x8dct

YYY untuk profile adalah 444 dan 10. YYYY untuk output-csp adalah i444 dan i420

1
x264-r2935-545de2f-naoLmod_x64.exe --output-depth 10 --profile highYYY --level 5.0 --preset veryslow --subme 10 --me umh --tune animation --crf 18 --deblock -1:-1 --rc-lookahead 60 --keyint 250 --bframes 16 --ref 16 --qcomp 0.75 --aq-strength 0.85 --merange 32 --psy-rd 0.80:0.05 --output-csp YYYY --colormatrix bt709 --aq-mode 3 --chroma-qp-offset -5 --fade-compensate 0.80 --no-fast-pskip --output "premuxbd_%~n1.264" "%~n1%~x1"

Untuk speed encode:

/assets/img/meme444/444testcode.png
444 Encode Speed
/assets/img/meme444/420testcode.png
420 Encode Speed

Lalu untuk size sendiri:

/assets/img/meme444/444mediainfo.png
444 Size
/assets/img/meme444/420mediainfo.png
420 Size

Kokkoku NCOP:

1
2
3
444: ~120 mb
420: ~130 mb
Perbadaan speed: ~1fps (lebih cepat 420)

4:4:4 tidak dapat bekerja dengan baik di resolusi ~1080p apalagi 4K, terlalu sedikit advantage yang bisa diambil dari 4:4:4 kalo 1080p+, jadi encoder biasanya ninggalin jadi 4:2:0 10bit aja

Tambahan

Skrip vapoursynth yang dibuat dan digunakan:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# zombieOP-4xx-10bit720p.vpy

import vapoursynth as vs
from vapoursynth import core
import fvsfunc as fvf

v = core.ffms2.Source(r"./BDMV/00008.mkv")[0:2157]
v = fvf.Depth(v, 16)
v444 = fvf.Downscale444(v, 1280, 720, kernely="bicubic", kerneluv="bicubic")
v420 = core.resize.Bicubic(v, 1280, 720)

v444y = core.std.ShufflePlanes(v444, 0, vs.GRAY)
v444y = core.std.PlaneStats(v444y, v444y).text.FrameProps().text.Text("Y Plane 444", 8) # Output: 720p
v420y = core.std.ShufflePlanes(v420, 0, vs.GRAY)
v420y = core.std.PlaneStats(v420y, v420y).text.FrameProps().text.Text("Y Plane 420", 8) # Output: 720p

v444u = core.std.ShufflePlanes(v444, 1, vs.GRAY)
v444u = core.std.PlaneStats(v444u, v444u).text.FrameProps().text.Text("U Plane 444", 8) # Output: 720p
v420u = core.std.ShufflePlanes(v420, 1, vs.GRAY).resize.Bicubic(1280, 720)
v420u = core.std.PlaneStats(v420u, v420u).text.FrameProps().text.Text("U Plane 420", 8) # Output: 360p

v444v = core.std.ShufflePlanes(v444, 2, vs.GRAY)
v444v = core.std.PlaneStats(v444v, v444v).text.FrameProps().text.Text("V Plane 444", 8) # Output: 720p
v420v = core.std.ShufflePlanes(v420, 2, vs.GRAY).resize.Bicubic(1280, 720)
v420v = core.std.PlaneStats(v420v, v420v).text.FrameProps().text.Text("V Plane 420", 8) # Output: 360p

compare = core.std.Interleave([v444v, v420v])

v444 = fvf.Depth(v444, 10)
v420 = fvf.Depth(v420, 10)

compare.set_output()

Anime yang digunakan: Zombieland Saga BD (NCOP)

Postingan selanjutnya mungkin tentang OCR