이미지와 비디오 인코딩의 원리

이미지를 저장하는 가장 단순한 방법은 모든 픽셀의 색상을 순서대로 저장하는 것이다. 이 픽셀 배열을 RAW 이미지 또는 비트맵(bitmap)이라고 부른다. 디스플레이 장치들은 이 데이터로부터 각 픽셀에 어떤 색을 출력할지를 결정한다.
그러나 이 방식은 비효율적이다. 예를 들어, 사람이 달리는 이미지를 살펴보자. 하늘을 표현하는 동일한 파란색이 픽셀 배열에 연이어 등장하는 일이 매우 잦다. 어떤 파란색이 200번 연속해서 픽셀에 등장한다면, 파란색을 배열에 200번 저장하는 것보다는, 파란색을 한 번만 저장하고 200번 반복된다는 정보를 저장하는 편이 경제적이다. 우리가 현실 속에서 다루는 이미지들은 픽셀들의 중복도(redundancy)가 충분히 높기 때문에, 이런 정보 저장 방식은 효율적으로 동작할 수 있다. 달리 표현하면 이미지의 엔트로피(entropy, 불규칙성)가 높을수록 압축률은 떨어진다. 극단적으로 모든 픽셀이 전혀 중복 없이 랜덤한 노이즈로 가득하다면, 오히려 비트맵으로 데이터를 저장하는 것이 데이터 크기가 더 작을 수도 있다. 반면, 모든 픽셀이 같은 색인 단색 이미지라면 압축 효율은 극단적으로 좋을 것이다.
동영상의 경우, 또 다른 방법을 떠올릴 수 있다. 앞서 소개한 이미지의 압축 방법은 하나의 정지화면 안에서 중복되는 픽셀을 이용한다. 한편, 연속된 프레임(정지화면) 사이의 픽셀 변화를 이용할 수도 있다. 예를 들어, 어떤 픽셀이 한 프레임에서 파란색인데, 그 다음 프레임에서도 동일한 파란색이라면 그 중복을 활용하여 데이터를 압축할 수 있다. 하나의 정지화면 안에서 픽셀의 중복을 활용하는 방식을 공간적 코딩(Spatial Coding, Intra-frame Coding), 연속된 정지화면 간의 픽셀의 중복을 활용하는 방식을 시간적 코딩(Temporal Coding, Inter-frame Coding)이라고 한다.
이미지의 압축 방식: JPG, PNG, GIF, WebP
JPG(=JPEG, Joint Photographic Experts Group)는 대표적인 손실 압축 방식이다. 사람의 눈은 미세한 색상 차이보다는 밝기에 더 민감하게 반응한다. 이 점을 이용하여 JPG 방식은 사람의 눈에 비슷하게 인식될 색상을 과감하게 통합한다. 정보 손실이 발생하지만, 압축률이 좋다. 한편 PNG(Portable Network Graphics)는 단 1비트의 손실도 없는 무손실 압축 방식이다. 색을 RGB 3가지만이 아니라, 투명도(alpha) 채널까지 지원한다. GIF(Graphics Interchange Format)는 움직이는 이미지를 저장할 수 있는 무손실 압축 방식이지만, 표현하는 색상 팔레트가 제한적이다. 보통 색은 RGB 각 1바이트씩 3바이트로 표현되고, PNG는 투명도를 포함하여 4바이트를 사용한다. 전문가용 고채색 HDR 영상은 RGB 각 10비트(합쳐서 약 4바이트)를 사용한다. 반면, GIF는 색 전체를 표현하는데에 1바이트밖에 지원하지 않아서 색상의 손실이 발생한다.
최근 웹 환경에서 가장 각광받는 방식은 WebP(웹피) 방식이다. WebP는 위 방식들의 장점만을 취한 현 시점에서 가장 강력한 압축 방식이다. JPG보다도 더 높은 압축률을 보이고, PNG처럼 투명색을 표현할 수 있으며, GIF처럼 움직이는 이미지를 지원한다. 이미지에 따라 손실 방식과 무손실 방식을 선택할 수도 있다. WebP의 단점은 아주 오래된 브라우저에서는 지원되지 않을 수 있다는 것뿐이다.
비디오 송출 방식: VBR과 CBR
같은 영상 안에서도 격렬하게 화면 전환이 일어나는 액션 장면이나 폭발 장면은 픽셀의 변화가 잦아 저장에 많은 데이터를 요구한다. 반면, 뉴스 앵커 장면이나 잔잔한 장면이라면 픽셀의 변화가 적어서 작은 크기로도 정보를 저장할 수 있다. 이런 장면의 차이에 따라, 비디오를 송출하는 속도(비트레이트)를 조절하는 방식을 VBR(Variable BitRate, 가변 비트레이트)라고 한다. 유튜브 서버가 사용자의 모바일 기기에 영상을 송출하는 경우가 대표적인 예이다. 한편, 영상의 내용에 관계없이 항상 일정한 속도로 비디오를 송출하는 방식을 CBR(Constant BitRate, 고정 비트레이트)라고 한다. CBR 방식으로 송출되는 비디오는 대역폭 관리가 수월하다는 장점이 있지만, 격렬한 장면에서 화질 열화(화질 저하)가 일어날 수 있다. 실시간 라이브 스트리밍에서 주로 활용한다.
DASH(Dynamic Adaptive Streaming over HTTP)는 동영상을 여러 개의 청크(chunk)로 나누어 송출하는 기술이다. 각 청크는 화면이 불규칙한 정도와 사용자의 네트워크 상태(사용자의 인터넷 연결 상태가 좋은지 나쁜지) 등을 고려하여 최적의 비트레이트로 사용자에게 송출된다. 흥미로운 점은 이 기술을 통해 나뉜 여러 청크의 비트레이트 분포가 영상마다 고유한 지문처럼 나타난다는 것이다. 이런 특징은 악성 사용자가 다른 사용자가 어떤 영상을 시청하고 있는지 탐지하는 보안 공격의 원리로 악용되기도 한다.
비디오 표준 생태계
MPEG(Moving Picture Experts Group)은 어떻게 비디오와 오디오를 효율적으로 압축할지를 결정하는 집단이다. 이들이 압축 방법의 표준을 정한 덕에 LG에서 만든 영상이 삼성의 갤럭시 기기에서도 송출될 수 있는 것이다. MPEG-1, MPEG-2, MPEG-4, MPEG-H 등의 규격이 이들로부터 제정되었고, DASH 또한 이들로부터 만들어졌기에 MPEG-DASH라고도 불린다. 한편, 이들과의 로열티 문제로 인해 구글/넷플릭스들이 뭉쳐 만든 AOMedia라는 단체가 AV1이라는 무료 코덱을 내놓기도 했고, 애플은 DASH 대신 독자적인 HLS(HTTP Live Streaming)를 표준으로 사용하기도 한다.
영상의 표준이 나뉘는 중요한 관점은 코덱(Codec)과 컨테이너다. 코덱은 압축(COmpressor)과 분해(DECompressor)의 약자다. 픽셀들의 시간적/공간적 중복을 알고리즘적으로 어떻게 압축할지를 의미한다. 현재 가장 널리 쓰이는 표준은 H.264이고, 초고화질 영상에는 H.265가 뛰어난 압축률 덕분에 유리하다.
컨테이너는 영상을 담는 그릇과 같다. 여러개의 청크로 쪼개진 영상들을 모아둔 것이다. 하나의 청크는 .ts, .m4s같은 확장자를 이용한다. 이 청크들을 어떤 순서로 조립할지를 설명하는 인덱스는 .m3u8, .mpd 같은 확장자를 이용한다. 여러개의 청크들과 인덱스, 영상을 설명하는 메타데이터와 오디오 스트림 등이 모여 .mp4, .avi같은 확장자를 가진 하나의 영상 파일이 된다.