소프트웨어 마스터링 관점에서 H.264 비디오 코덱의 효율성
2016.05.28 10:45
x264 10비트 인코더가 컴파일된 ffmpeg (64비트)로 인코딩을 했고 24분 동영상에 대략 8시간 정도 걸렸습니다. 피인코딩 대상은 웨이블릿 변환 알고리즘을 사용하는 모션 JPEG2000 코덱으로 500Mbps로 인코딩된 영상입니다. 그리고 업로드 원본을 서버에 저장한 뒤에 재인코딩을 염두해야하는 유튜브의 특성상 시간적 압축을 사용할 경우 (Inter-Coding) 블럭 현상이 나타날 가능성이 높아서 공간적 압축 (Intra-Coding; I-Frame Only; No P-Fremes and No B-Frames; GOP: N=1)만 진행하였고 이를 H.264 4:4:4 Predictive Intra (YUV 4:4:4 10비트, GOP: N=1) 프로파일로 인코딩하였습니다.
General
Unique ID : 177299470427735291600000470290746328193 (0x8562A2CBCA0D7E81AE3DC75E32204481)
Complete name : C:\BF4_FTR_YouTube-48_H-178_EN-XX_KR-AL_20_2K_OFR_20160521-220232_APP_SMPTE_OV.mkv
Format : Matroska
Format version : Version 4 / Version 2
File size : 48.0 GiB
Duration : 23mn 59s
Overall bit rate mode : Constant
Overall bit rate : 287 Mbps
Encoded date : UTC 2016-05-27 22:57:43
Writing application : mkvmerge v9.0.1 ('Obstacles') 64bit
Writing library : libebml v1.3.3 + libmatroska v1.4.4
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High 4:4:4 Predictive Intra@L5.1
Format settings, CABAC : Yes
Format settings, GOP : N=1
Codec ID : V_MPEG4/ISO/AVC
Duration : 23mn 59s
Bit rate mode : Constant
Bit rate : 281 Mbps
Nominal bit rate : 360 Mbps / 360 Mbps
Width : 2 560 pixels
Height : 1 440 pixels
Display aspect ratio : 16:9
Frame rate mode : Constant
Frame rate : 48.000 fps
Color space : YUV
Chroma subsampling : 4:4:4
Bit depth : 10 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 1.586
Stream size : 47.0 GiB (98%)
Writing library : x264 core 148 r2638 7599210
Encoding settings : cabac=1 / ref=1 / deblock=1:-1:1 / analyse=0x3:0x133 / me=tesa / subme=9 / psy=1 / psy_rd=1.00:0.20 / mixed_ref=0 / me_range=64 / chroma_me=1 / trellis=0 / 8x8dct=1 / cqm=1 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=4 / threads=8 / lookahead_threads=8 / sliced_threads=1 / slices=8 / nr=0 / decimate=0 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=1 / keyint_min=1 / scenecut=1 / intra_refresh=0 / rc_lookahead=0 / rc=cbr / mbtree=0 / bitrate=360000 / ratetol=0.1 / qcomp=0.00 / qpmin=1 / qpmax=81 / qpstep=2 / vbv_maxrate=360000 / vbv_bufsize=7500 / nal_hrd=cbr / filler=1 / ip_ratio=1.40 / aq=3:1.00
Language : Korean
Default : Yes
Forced : No
Color range : Limited
Color primaries : BT.2020
Transfer characteristics : BT.2020
Matrix coefficients : BT.2020 non-constant
Audio
ID : 2
Format : PCM
Codec ID : A_PCM/FLOAT/IEEE
Duration : 23mn 59s
Bit rate mode : Constant
Bit rate : 6 144 Kbps
Channel(s) : 2 channels
Sampling rate : 96.0 KHz
Frame rate : 32.001 fps (3000 spf)
Bit depth : 32 bits
Stream size : 1.03 GiB (2%)
Language : English
Default : Yes
Forced : No
웨이블릿 기반 코덱을 H.264라는 DCT 기반 코덱으로 인코딩 했을 때의 SSIM과 PSNR 수치입니다. 크로마 서브샘플지 않고 RGB 4:4:4 색공간을 YUV 4:4:4로만 변환하였고 시간적 압축을 쓰지 않는 인트라 코딩을 할 경우 H.264의 평균 PSNR은 무려 50dB을 넘어가고 전역 PSNR은 49dB에 육박하네요. SSIM 수치는 무려 25dB에 육박하는군요. 마스터링의 관점에서 H.264는 아직 쓸만한 코덱이라는 점이 놀랍고 최근에 소니가 왜 H.264를 기반으로 한 XAVC 솔루션을 자사 카메라에 사용하고 있는지를 알게해줍니다.
[libx264 @ 00000199a67700a0] frame I:69081 Avg QP:19.53 size:937500 PSNR Mean Y:51.57 U:52.23 V:52.61 Avg:51.91 Global:49.37
[libx264 @ 00000199a67700a0] mb I I16..4: 1.1% 83.0% 15.9%
[libx264 @ 00000199a67700a0] 8x8 transform intra:83.0%
[libx264 @ 00000199a67700a0] coded y,u,v intra: 99.1% 74.2% 68.9%
[libx264 @ 00000199a67700a0] i16 v,h,dc,p: 16% 45% 33% 7%
[libx264 @ 00000199a67700a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 10% 16% 10% 8% 11% 9% 12% 10% 15%
[libx264 @ 00000199a67700a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 14% 20% 4% 8% 11% 9% 12% 8% 14%
[libx264 @ 00000199a67700a0] SSIM Mean Y:0.9967389 (24.866db)
[libx264 @ 00000199a67700a0] PSNR Mean Y:51.569 U:52.232 V:52.609 Avg:51.909 Global:49.373 kb/s:360000.00
아무리 인터넷 스트리밍 동영상에 시간적 압축을 통해서 블럭 현상 (깍두기 현상)을 심하게 보이면서 천덕꾸러기 취급을 받는 H.264도 이렇게 시간적 압축을 사용하지 않고 약간의 대역폭 절감만 거친 마스터링 원본을 만들 때에는 상당히 화질 보존이 좋은 듯합니다. 그래서 소니가 H.264 코덱을 바탕으로 자사 미러리스 카메라와 시네마 카메라에 XAVC 솔루션을 쓰는 듯합니다. XAVC 중에서 인트라 방식이 XAVC-I (또는 XAVC Intra)인데 MPEG2에 비해서도 저장 화질이 좋아졌죠. 물론 소니 카메라들은 아직까지 YUV 4:4:4를 안쓰고 H.264에 High 4:2:2 프로파일 또는 High 4:2:2 Intra 프로파일을 통해서 YUV 4:2:2 색상을 저장하는 듯합니다.
여기서 I프레임은 모든 픽셀 정보를 누락없이 갖고있고 화질은 JPEG 이미지 수준인 하나의 프레임입니다. P프레임은 투명 바탕 (픽셀 정보가 전혀 없는 배경)에 이전 I프레임과 다음 I프레임 간의 차이점을 부분적인 유효 픽셀로 나타낸 프레임으로 I프레임과는 달리 온전한 픽셀 정보를 갖고있지 않고 부분적인 픽셀 정보를 갖고 있습니다. B프레임은 I프레임과 I프레임, 또는 I프레임과 P프레임 간의 차이를 이미지가 아닌 벡터 정보로 표현한 프레임으로 I프레임과 P프레임보다 상당한 용량 절감이 가능합니다.
시중에 블루레이 동영상 원본, 인터넷 스트리밍 미디어, 토렌트에 떠도는 릴리즈 원본 등 최종 배포본은 용량이 큰 I프레임의 사용을 줄이고 용량이 적은 P프레임과 B프레임의 사용을 극대화하여 대역폭을 줄이는 방식을 사용하고 있습니다. 하지만 이러한 방식은 재인코딩을 염두해두지 않고 대역폭의 절약을 목표로 인코딩되었으므로 이러한 소스를 대상으로 재인코딩을 거치게 되면 P프레임과 B프레임의 화질 문제로 인해 블럭 현상이 발생하게 되는 것입니다.
현재 미국의 ATSC 표준을 준수하는 우리나라의 지상파 방송은 용량 대비 화질이 매우 떨어지는 구식의 MPEG-2 코덱으로 송출되고 있습니다. 가뜩이나 한국의 채널 대역폭은 CBR 20Mbps 밖에 안되는 열약한 수준에서 ATSC 표준에 압축률이 높은 H.264 코덱도 사용할 수 있다고 기재되어 있음에도 하위호환을 위해 MPEG-2 코덱을 아직도 사용하고 있습니다. 거기에 스카이라이프, IPTV 통신사, 케이블TV 업체들이 중간에 H.264 코덱으로 더 낮은 대역폭으로 재압축을 거쳐서 송출하고 있으니 실제로 시청자들이 보는 방송의 화질은 매우 떨어질 수 밖에 없습니다. 아무리 H.264 코덱이라고 해도 지상파 송출 원본 자체부터 CBR 20Mpbs라는 제한된 대역폭에 맞추기 위해 P프레임과 B프레임을 과도하게 많이 사용한 시간적 압축 소스이므로 재압축의 결과물은 정말로 형편없는 수준이 되는겁니다.
이제 지상파 3사가 4K 방송은 압축률이 뛰어난 H.265 (HEVC) 코덱을 바탕으로 대역폭이 기존에 비해 50% 더 높아진 CBR 30Mbps에 맞춰서 송출을 한다고는 하나 중간 서비스 회사에 의한 재압축은 결국 피할 수 없는 현실이고 이로 인한 열화된 화질은 결국 시청자들에게 돌아가는 것이죠. 설상 중간 서비스 회사가 화질 열화를 줄이기 위하여 HEVC 코덱을 사용한다고 하더라도 시각적인 화질 열화는 분명히 발생합니다. B프레임과 P프레임의 효율적인 배분을 극대화하여 최종 배포본의 대역폭을 50% 절감시킨 VP9 코덱과 HEVC 코덱이 나오긴 했지만 B프레임과 P프레임의 고질적인 문제를 해결할 수는 없습니다.
유튜브의 동영상 스트리밍도 또한 마찬가지 입니다. 특히 유튜브는 최대 128GB까지의 단일 업로드 소스를 지원하고 있으며 업로드 원본을 서버 내에 업로더에 의한 삭제 요청 전까지 영구 소장하고 있고 업로드 원본을 복사하여 해상도 별, 비디오 코덱 별 스트리밍 동영상을 인코딩하는 자동화 시스템을 갖추고 있습니다. 이런 상황에서는 시중의 방식으로 P프레임과 B프레임을 많이 사용한 동영상을 업로드하면 유튜브에 의해 재인코딩 된 스트리밍 동영상은 I프레임만 사용된 업로드 동영상을 재인코딩한 동영상 대비 상당한 화질 열화를 겪게 됩니다.
물론 I프레임만 사용하는 동영상도 결국 무압축이나 무손실 압축이 아닌 이상에는 계속해서 우려먹으면 JPEG 압축 알고리즘의 특성 상 화질 열화는 보일 수 밖에 없지만 그렇다고 용량이 방대한 무압축 원본으로 작업하기에는 용량이 부담스럽죠.
댓글 [6]
-
비려막존 2016.05.28 13:16
-
BSOD 2016.05.28 17:49 b,p프레임을 충분히쓴 영상을 재인코딩해도 264 옵션 잘 설정하고 디블럭필터같은것만 적절히 써줘도 블럭이 심하게 생기지는 않죠. 근데 TV방송은 여전히 풀HD급 깍두기가 난무하는걸 보면 역시 대역폭과 비트레이트는 어쩔 수 없나봅니다. 265를 써서 대역폭을 확보한다 해도 지금같은 방식에 4k해상도로 올라가면 깍두기는 여전히 보이지 않을까 생각되기도 하는군요. -
엘레벨 2016.05.28 22:51
브루스 배너 박사와 토니 스타크가 치타우리 셉터에 대한 이야기를 나눌 때
다른 어벤져서 멤버들이 느끼는 기분이 이런 것이겠군요
-
DarknessAngel 2016.05.28 23:08
264 나쁘지는 않지만, 아직까지 호환성을 고려하면 8bit를 추천합니다
대부분의 하드웨어기반 디코더 아직 10bit처리못합니다 (그래픽의 내장디코더만이 아니라 대부분의 soc내장도 마찬가지입니다)
265도 최근 인지도는 높아지고 있지만, 아직까지 하드웨어 지원측면에서 미비하고, 인코딩시 걸리는 연산 부하도 너무 과합니다 (하드웨어 인코더 그다지 없음)
마지막으로 대역폭 4k에서 제대로 보일정도로 송출할려면 100M급 회선 혼자 다 먹다시피합니다
-
흙기사 2016.06.05 11:12
좋은 글 감사합니다.마스터링 압축이 결국 원본의 화질을 큰 화질 저하없이 최대한 용량을 줄이고자 함인데요.현재로서는... 마스터링은 h.264로 하시고 유튜브 업로드는 압축된 것이 아닌 원본으로 하면 해결 될 것 같네요.각각의 목적과 장단점이 있는것이니...일반인 입장에서 원본이던 h.264이던 mpeg2 방식이던 겉으로 보이기에 비슷한 화질이라면 유튜브에 올리는 순간 화질차이가 난다면유튜브의 렌더링이 문제라고 생각합니다.내부에서 무압축으로 업스케일링하고 재압축을 하더라도 해결해야 하는 부분이지사용자 입장에서 화질은 차이가 없는데도 유튜브에서 변환이 잘 되는 포멧으로 일일이 바꿔야 한다면 귀찮은 일이 아닐까요?저도 개인적으로 촬영한 영상들이 꽤 되어서 mpeg2 방식을 h.264로 일괄 변환하는 작업을 많이 했는데요.(옵션을 저렇게 자세히 세팅은 못합니다^^)어쨋던 열화가 생기는 부분이고 하드용량이 커져서 굳이 압축을 안해도 되겠더군요. 귀찮기도 하고요...하지만 이건 개인적인 활용면에서의 의견일 뿐이고...앞으로 4K나 VR등 여러가지 수요로 더 고압축의 알고리즘이 중요해질 것 같습니다.H.265의 인코딩칩도 그렇고 내장그래픽에서도 가속지원이 된다던지... CPU만으로 편집이 원할해 진다던지 등이요.영상관련 사이트에 올리시면 더 반응이 좋을 것 같네요. -
무주처사 2016.06.07 11:25
추천^^
누구보라고 쓴글인지 짐작이안가네요. 이거강좌맞나요