복잡한 영상 압축의 세계, H.264 AVC 알고리즘 이해와 프로그램 분석 매우 쉬운 방법
우리가 매일 시청하는 유튜브, 넷플릭스, 화상 회의의 뒤편에는 영상의 용량을 획기적으로 줄여주는 압축 기술이 숨어 있습니다. 그 중심에 있는 것이 바로 H.264/AVC입니다. 전문가들만 아는 어려운 기술처럼 보이지만, 핵심 원리를 파헤쳐 보면 생각보다 명쾌한 구조를 가지고 있습니다. 이 글에서는 복잡한 수식을 배제하고 논리적인 흐름에 따라 H.264 알고리즘을 분석하는 가장 쉬운 방법을 제시합니다.
목차
- H.264 AVC가 무엇인가요?
- 영상 압축의 핵심 원리: 중복 제거
- H.264의 주요 알고리즘 단계별 분석
- 프로그램 분석을 위한 소스 코드 접근법
- 효율적인 학습을 위한 도구 활용법
1. H.264 AVC가 무엇인가요?
H.264 혹은 AVC(Advanced Video Coding)는 현재 전 세계에서 가장 널리 쓰이는 영상 압축 표준입니다.
- 정의: 고화질의 영상을 저장하거나 전송할 때 데이터의 크기를 줄여주는 기술입니다.
- 성능: 이전 표준인 MPEG-2 대비 약 50% 이상의 높은 압축 효율을 자랑합니다.
- 범용성: 스마트폰, 스트리밍 서비스, 블루레이 등 거의 모든 디지털 영상 매체에서 표준으로 사용됩니다.
2. 영상 압축의 핵심 원리: 중복 제거
영상을 그대로 저장하면 용량이 너무 커지기 때문에, H.264는 ‘불필요한 정보’를 찾아 지우는 방식을 사용합니다.
- 공간적 중복 제거 (Intra Prediction)
- 현재 프레임 내에서 인접한 픽셀끼리 유사한 성질을 이용합니다.
- 파란 하늘 사진에서 한 픽셀이 파란색이면 주변도 파란색일 확률이 높다는 점을 활용해 예측값을 계산합니다.
- 시간적 중복 제거 (Inter Prediction)
- 동영상은 연속된 사진의 모임입니다. 1초 전의 배경과 지금의 배경은 거의 같습니다.
- 움직이는 물체만 추적하고 나머지 변하지 않는 부분은 이전 데이터를 재사용합니다.
- 통계적 중복 제거 (Entropy Coding)
- 자주 나타나는 데이터에는 짧은 코드를 부여하고, 드물게 나타나는 데이터에는 긴 코드를 부여해 전체 비트 수를 줄입니다.
3. H.264의 주요 알고리즘 단계별 분석
알고리즘의 흐름을 이해하는 것은 프로그램을 분석하는 지도가 됩니다.
- 예측 (Prediction)
- 화면을 일정 크기의 블록(Macroblock)으로 나눕니다.
- 주변 픽셀이나 이전 프레임을 참고해 현재 블록의 색상을 예상합니다.
- 변환 및 양자화 (Transform and Quantization)
- 예측값과 실제값의 차이(잔차)를 구합니다.
- 이 잔차 데이터를 주파수 영역으로 변환(DCT)하고, 중요도가 낮은 미세한 정보를 삭제(양자화)하여 데이터 크기를 대폭 줄입니다.
- 루프 필터링 (In-loop Filtering)
- 압축 과정에서 발생하는 화면의 격자 무늬(Blocky Artifact)를 매끄럽게 다듬어 화질을 개선합니다.
- 엔트로피 부호화 (Entropy Coding)
- 최종적으로 남은 데이터를 이진수(0과 1) 스트림으로 변환하여 저장합니다.
4. 프로그램 분석을 위한 소스 코드 접근법
이론을 넘어 실제 프로그램 코드를 분석할 때 유의해야 할 사항입니다.
- 프로파일과 레벨 이해
- 코드 내에서 어떤 Profile(Baseline, Main, High)을 지원하는지 확인해야 합니다.
- 각 프로파일마다 사용하는 기술적 도구 세트가 다르기 때문입니다.
- NAL Unit (Network Abstraction Layer) 분석
- H.264 데이터는 NAL Unit이라는 단위로 쪼개져 전달됩니다.
- 헤더 정보를 통해 해당 데이터가 핵심 영상 데이터인지, 설정 값(SPS, PPS)인지 구분하는 로직을 먼저 찾아야 합니다.
- 비트스트림 파싱 함수 찾기
read_bits혹은get_uev같은 함수를 검색해 보세요.- 압축된 바이너리 데이터를 의미 있는 값으로 해석하는 지점이 코드 분석의 시작점입니다.
5. 효율적인 학습을 위한 도구 활용법
단순히 텍스트 코드를 읽는 것보다 시각화 도구를 쓰는 것이 훨씬 빠릅니다.
- H.264 Analyzer 활용
- 영상이 어떻게 블록으로 나뉘는지, 움직임 벡터(Motion Vector)가 어디를 향하는지 시각적으로 보여주는 전문 분석 소프트웨어를 사용합니다.
- FFmpeg 소스 코드 참고
- 오픈 소스인 FFmpeg의
libavcodec내에 있는 h264 관련 코드는 교과서와 같습니다. - 방대한 양에 압도되지 말고, 디코딩의 시작점인
decode_slice함수부터 추적해 보시기 바랍니다.
- 비트스트림 덤프 확인
- 실제 바이너리 데이터를 16진수로 열어보고 NAL Unit 헤더인
00 00 00 01을 직접 찾아보며 구조를 익히는 습관을 들입니다.