원문 캡처 · sidbala.com
원문 캡처 · sidbala.com

H.264는 인터넷 영상부터 블루레이, 휴대전화, 보안 카메라, 드론까지 폭넓게 쓰이는 영상 압축 표준이다. 이 글은 수십 년 동안 발전해 온 영상 압축의 원리를 사례와 함께 쉽게 설명한다.

비압축 영상은 각 프레임의 픽셀을 담은 데이터다. 픽셀마다 빨강·초록·파랑을 저장하는 데 3바이트가 필요하다. 1920×1080 해상도의 영상을 초당 60프레임으로 저장하면 초당 약 370MB의 데이터가 생긴다. 50GB 블루레이 디스크에는 약 2분 분량만 담을 수 있고, 데이터를 빠르게 옮기기도 어렵다. 그래서 영상 압축이 필요하다.

글쓴이는 애플 홈페이지를 화면 녹화해 만든 두 파일을 비교한다. PNG 스크린샷은 1015KB인 반면, 같은 화면을 60프레임으로 5초간 녹화한 H.264 영상은 175KB다. 영상은 300프레임인데도 파일 크기는 스크린샷 하나의 약 5분의 1이다.

한 프레임에서 덜 중요한 정보 버리기

H.264는 손실 압축 코덱이다. 덜 중요한 정보를 버려 파일 크기를 줄인다. 반면 PNG는 무손실 압축 방식이어서 원본 이미지의 정보를 비트 단위로 복원할 수 있다.

H.264는 화면의 특정 영역을 통째로 자르는 대신 이미지의 세부 정보를 줄인다. 예를 들어 스피커 구멍처럼 아주 작은 무늬는 압축 과정에서 사라질 수 있지만, 화면을 확대하지 않으면 차이를 알아채기 어렵다.

이 과정에는 정보 이론의 엔트로피 개념이 쓰인다. 엔트로피는 데이터에 담긴 정보를 표현하는 데 필요한 최소 비트 수를 뜻한다. 같은 결과를 더 짧은 표현으로 나타내는 방식은 데이터의 중복을 줄인다. 엔트로피 부호화는 이런 중복을 찾아 데이터를 압축하며, 손실 없이 원래 정보를 복원할 수 있다.

이미지 압축은 픽셀의 위치 대신 주파수 성분으로 데이터를 표현하기도 한다. 색과 밝기가 천천히 변하는 영역은 낮은 주파수 성분에, 미세한 무늬처럼 빠르게 변하는 부분은 높은 주파수 성분에 해당한다. 주파수 영역에서 높은 주파수 성분을 줄인 뒤 이미지로 되돌리면 세부 묘사는 줄지만 전체 모습은 비슷하게 유지된다. 이처럼 세부 정보를 조절해 버리는 과정을 양자화라고 한다.

색차 서브샘플링도 데이터 크기를 줄인다. 영상의 색 정보는 밝기 성분 Y와 색차 성분 Cb·Cr로 나눌 수 있다. 사람의 눈은 색의 미세한 차이보다 밝기의 차이를 더 잘 감지한다. 그래서 밝기는 전체 해상도로 유지하고 색차 정보는 더 낮은 해상도로 저장할 수 있다. 글은 색차 성분을 4분의 1 해상도로 저장하면 시각적 차이를 거의 느끼지 못하면서 필요한 대역폭을 절반으로 줄일 수 있다고 설명한다.

프레임 사이의 움직임 압축하기

한 프레임 안의 정보를 줄인 다음에는 시간에 따른 변화를 이용한다. 테니스 경기처럼 배경은 그대로이고 공만 움직이는 영상이라면, 매번 화면 전체를 저장하는 대신 배경과 움직임을 따로 다루는 편이 효율적이다.

H.264는 화면을 보통 16×16픽셀 크기의 매크로블록으로 나눠 움직임을 추정한다. I프레임은 화면 전체를 구성하는 정보를 담는다. 이후 P프레임은 이전 프레임을 바탕으로 블록별 움직임 벡터를 저장하고, B프레임은 과거와 미래 프레임을 모두 참조해 예측한다. 디코더는 I프레임에서 시작해 각 프레임의 움직임을 더해 현재 화면을 재구성한다.

이 방식은 움직임이 있는 영상의 저장 공간을 크게 줄이는 대신 계산을 필요로 한다. 영상 재생 중 임의의 시점으로 이동하면 디코더가 가까운 I프레임부터 선택한 시점까지의 움직임을 다시 계산해야 해 재생이 잠시 지연될 수 있다.

마지막으로 무손실 엔트로피 부호화가 남은 중복을 줄인다. I프레임에 남은 중복 정보나 여러 매크로블록에서 반복되는 움직임 벡터를 압축한다.

글의 예시 영상은 1232×1154 해상도로 초당 60프레임, 5초 분량이다. 비압축 데이터로 계산하면 약 1.2GB지만 H.264 파일은 175KB다. 글쓴이는 자동차 무게에 빗대면 3000파운드짜리 차가 0.4파운드, 즉 6.5온스가 된 셈이라고 표현한다. 다만 글쓴이는 설명이 수십 년간의 연구를 크게 단순화했다고 덧붙인다.

더 자세한 내용은 H.264 위키백과 문서에서 확인할 수 있다. 참고 자료로 SSD 벤치마크, 나이퀴스트-섀넌 표본화 정리, 양자화, 색차 서브샘플링도 소개한다.