Skip to content

컨테이너와 코덱

컨테이너 포맷(Container Format)

앞서 말한 것처럼 동영상 확장자는 오디오, 비디오 데이터인 스트림(Stream)을 하나 이상 가지고 있는 보관함 역할을 하며 이를 컨테이너 포맷(Container Format) 혹은 래퍼 포맷(Rapper Format)이라 부른다.

스트림(Stream)은 데이터, 패킷, 비트 등 일련의 연속성을 갖는 흐름/데이터를 의미하는데 간단히 컨테이너가 가지고 있는 비디오, 오디오 데이터라 생각할 수 있다.

컨테이너가 가지고 있는 비디오, 오디오 스트림(Stream)들은 코덱(Codec)을 통해 가공된 데이터들이다. 왜 코덱을 통해 가공을 했을까?

코덱(Codec)

코덱은 코더(Coder)와 디코더(Decoder)의 앞글자를 딴 합성어로 용량이 큰 영상을 다른 곳으로 이동하거나 보관하기 쉽게 압축하고 후에 재생할 때 다시 복원하는 역할을 한다.

따라서 아날로그 신호나 스트림 데이터로 이루어진 비디오와 오디오를 압축된 부호로 변환하는 과정를 인코딩(Encoding)이라 하고 압축된 데이터를 본래의 아날로그 혹은 스트림 데이터로 복원하는 과정을 디코딩(Decoding)이라 한다.

코덱은 비디오를 인/디코딩 하는 비디오 코덱(H.264, AV1 등등)과 오디오를 인/디코딩하는 오디오 코덱(AAC, MP3 등등)으로 나뉘어져 있다. 동영상 컨테이너, 비디오 코덱과 오디오 코덱 종류에 대해서는 위의 관련 포스트에서 자세히 다루었다.

또한 압축 방식에는 원본이 손상되는 손실 압축과 원본의 손실 없이 그대로 보전되는 무손실 압축이 있는데 일반적으로 데이터를 더 많이 압축하기 위해 손실 압축을 사용한다.

컨테이너(Container)의 역할 컨테이너에는 코덱에 의해 압축(인코딩)된 미디어, 오디오 스트림이 담겨있다. 그럼 컨테이너는 단순히 스트림을 담는 역할만 하는 것일까?

컨테이너는 스트림을 제어할 수 있는 다양한 정보들을 가지고 있다.

동영상 컨테이너가 스트림을 제어하는데 사용하는 정보들

  1. 동영상 촬영 당시, 또는 임의로 기록된 메타 정보(촬영 날짜, 위치 등)
  2. 컨테이너가 가지고 있는 스트림의 개수
  3. 동영상 전체 길이
  4. DVD에서 제공하는 메뉴와 자막 정보
  5. 인터넷을 통한 동영상 재생(스트리밍) 시 빠른 탐색이 필요한 스트림 위치 정보

물론 모든 컨테이너가 이와 같은 정보를 다 가지고 있지는 않다. 컨테이너도 스트리밍에 특화된 컨테이너, 확장성을 고려한 컨테이너, 저장에 특화된 컨테이너 등 용도에 따라 다양한 종류가 있으므로 어떠한 역할을 하는지 이해하고 넘어가면 될 거 같다.

컨테이너에 스트림을 담는 일련의 과정을 멀티플렉싱(Multiplexing), 줄여서 먹싱(Muxing)이라 부르며 다양한 종류의 코덱으로 인코딩된 스트림 정보를 담을 수 있다. 그로 인해서 같은 컨테이너 확장자이지만 완전 다른 코덱으로 인코딩된 스트림을 가지고 있을 수 있다.

ex) MP4 컨테이너(H.264 비디오 코덱 + ACC 오디오 코덱)와 MP4 컨테이너(DivX 비디오 코덱 + MP3 오디오 코덱)

하지만 컨테이너도 종류마다 담을 수 있는 코덱과 아닌 코덱이 있고 비디오 플레이어마다 실행시킬 수 있는 코덱과 아닌 코덱이 있다. 즉, 같은 컨테이너 포맷이어도 안에 들어있는 비디오, 오디오 스트림이 달라 미디어 플레이어가 따라 재생이 될 수도 있고 안될 수도 있다는 뜻이다.

결국

  1. 컨테이너 포맷(확장자)

  2. 비디오 코덱

  3. 오디오 코덱

  4. 이를 실행시킬 미디어 플레이어

이 4가지가 제대로 되어야만 동영상을 재생할 수 있는 것이다.

따라서 최적의 영상을 보기 위해서는 재생되는 환경에 알맞는 컨테이너와 코덱을 선택할 수 있어야 한다.

주요 코덱

비디오 코덱

  • H.264 (AVC): 가장 널리 사용, 호환성 우수
  • H.265 (HEVC): H.264 대비 약 50% 더 효율적, 인코딩 시간 증가
  • VP9: 구글의 오픈소스 코덱
  • AV1: 최신 오픈소스, 매우 효율적이지만 인코딩 느림

오디오 코덱

  • AAC: 고품질, MP4와 주로 사용
  • MP3: 오래됐지만 여전히 널리 사용
  • Opus: 최신 오픈소스, 낮은 지연시간

주요 컨테이너

  • MP4: 가장 범용적, H.264 + AAC 조합이 일반적
  • MKV: 거의 모든 코덱 지원, 다중 오디오/자막 트랙 가능
  • WebM: 웹 스트리밍용, VP8/VP9 + Vorbis/Opus

비디오 압축 원리

압축 기법

  • 공간적 압축: 한 프레임 내 중복 제거 (JPEG와 유사)
  • 시간적 압축: 연속 프레임 간 변화만 저장, 모션 벡터 사용
  • 색상 서브샘플링: 밝기는 full 해상도, 색상은 낮은 해상도로 저장
    • 인간 눈이 색상 변화에 둔감한 점 활용
  • 양자화: 세밀한 차이 무시하여 데이터 감소
    • 정보 손실 발생하지만 적절히 조절하면 인지 불가
  • 엔트로피 코딩: 자주 나타나는 패턴을 짧은 코드로 대체 (무손실)

플레이어 재생 과정

1. 파일 분석

  • 파일 헤더 읽어서 컨테이너 포맷 식별
  • 스트림 목록 파악 (비디오, 오디오, 자막)
  • 각 스트림의 코덱 정보 확인

2. 디먹싱 (Demuxing)

  • 컨테이너에서 각 스트림 분리
    • 비디오 패킷 → 비디오 디코더
    • 오디오 패킷 → 오디오 디코더
  • 타임스탬프 관리
    • PTS (Presentation Time Stamp): 프레임 표시 시간
    • DTS (Decoding Time Stamp): 디코딩 시간

3. 디코딩

비디오 디코딩 과정

압축된 비트스트림
↓ 엔트로피 디코딩
역양자화
↓ 역 DCT 변환
모션 보상 (P, B 프레임 복원)
↓ 디블로킹 필터
YUV 색공간
↓ 색공간 변환
RGB 픽셀 데이터

오디오 디코딩

  • 압축된 데이터 → PCM (Pulse Code Modulation) 샘플로 변환
  • 샘플레이트와 비트 깊이에 맞게 복원

4. 동기화

  • PTS 기준으로 비디오와 오디오 동기화
  • 버퍼링으로 타이밍 조절
  • 디코딩 느리면 프레임 드롭 또는 버퍼링 발생

5. 렌더링

비디오

  • 디코딩된 프레임을 그래픽 메모리로 전송
  • 필요시 스케일링, 색상 보정
  • 화면 주사율에 맞춰 표시

오디오

  • PCM 데이터를 오디오 버퍼로 전송
  • 사운드 카드가 아날로그 신호로 변환
  • 스피커 출력

하드웨어 가속

  • GPU나 전용 칩으로 비디오 디코딩
  • 소프트웨어 디코딩 대비 CPU 사용률 90% 이상 감소

주요 기술

  • NVIDIA NVDEC: NVIDIA GPU 전용 디코딩 칩
  • Intel Quick Sync: Intel 내장 그래픽 디코딩
  • AMD VCE/VCN: AMD GPU 비디오 처리 엔진

장점

  • CPU 사용률 감소
  • 전력 소비 감소
  • 4K, 8K 고해상도 영상 원활 재생

제한사항

  • 지원 코덱이 제한적
  • 구형 GPU는 H.264만 지원 가능

스트리밍 고려사항

적응형 스트리밍

  • HLS (HTTP Live Streaming): Apple 프로토콜
  • DASH (Dynamic Adaptive Streaming over HTTP): MPEG 표준
  • 영상을 짧은 세그먼트로 분할
  • 각 세그먼트를 여러 화질로 인코딩
  • 네트워크 상황에 따라 화질 자동 선택

버퍼 관리

네트워크 → 다운로드 버퍼 → 디먹싱 → 디코드 버퍼 → 재생
↑ ↓
└──── 버퍼 상태에 따라 품질 조절 ────┘
  • 버퍼 충분: 일시적 네트워크 지연에도 끊김 없음
  • 버퍼 부족: 추가 데이터 받을 때까지 재생 중단
  • 초당 24~60회 반복되면서 부드러운 영상 재생
  • 각 단계는 밀리초 단위로 정밀 동작
  • 현대 미디어 플레이어는 이 과정을 자동 처리

참고