FFmpeg

Codec & Container

영상 파일에서 코덱과 컨테이너가 어떤 역할을 하는지, AVI와 MP4의 차이를 중심으로 정리한다.

Codec

코덱이 무엇인가?

Codec는 Coder와 Decoder의 합성어이다.

코덱은 영상이나 음성을 압축하고 다시 풀어주는 방식이다.

영상은 사실상 이미지 수천 장과 음성이 빠르게 이어지는 것이다. 이것을 그대로 저장하게 되면 용량이 매우 커지므로 코덱을 이용하여 압축해 mp4나 avi 같은 영상 파일로 저장한다.

다시 재생하거나 OpenCV로 읽을 때는 코덱으로 압축을 해제하고 프레임 이미지로 변환하여 화면에 출력한다.

하나의 영상 파일을 압축하거나 재생할 때는 비디오 코덱 1개, 오디오 코덱 1개, 컨테이너 1개(확장자)가 사용된다.

그럼 확장자(mp4, avi)와 코덱은 같은 개념인가?

확장자와 코덱은 다르다.

확장자는 코덱으로 압축된 영상 데이터를 어떤 식으로 정리할 건지에 대한 정의이다.

avi는 다음과 같이 압축된 데이터가 정리된다.

video.avi

RIFF AVI 헤더
├─ 이 파일은 AVI다
├─ 비디오 트랙 정보
├─ 오디오 트랙 정보
├─ FPS 정보
└─ **코덱 정보** <- 여기서 OpenCV가 코덱 정보를 읽어 영상을 재생한다. 

movi 영역
├─ 비디오 조각 A
├─ 오디오 조각 a
├─ 비디오 조각 B
├─ 오디오 조각 b
├─ 비디오 조각 C
├─ 오디오 조각 c
├─ 비디오 조각 D
└─ 오디오 조각 d

index 영역
├─ A는 파일의 몇 번째 위치에 있음
├─ B는 파일의 몇 번째 위치에 있음
├─ C는 파일의 몇 번째 위치에 있음
└─ D는 파일의 몇 번째 위치에 있음

보이는 것과 같이 avi는 헤더와 데이터 덩어리들 그리고 단순 인덱스로 구성되어 있다.

avi는 옛날 방식이라 구조가 단순하고 특히 시간 정보가 단순하여 복잡한 시간 정보 처리에 약하다.

mp4는 다음과 같이 압축된 데이터가 정리된다.

video.mp4

ftyp box
├─ 이 파일은 MP4 계열이다

moov box
├─ 영상 전체 정보
├─ 비디오 트랙 정보
├─ 오디오 트랙 정보
├─ 각 조각의 시간 정보
├─ 각 조각의 위치 정보
├─ 각 조각의 크기 정보
├─ **코덱 설정 정보** <- 여기서 OpenCV가 코덱 정보를 읽어 영상을 재생한다. 
└─ 재생 순서 정보

mdat box
├─ 압축된 비디오 조각 A
├─ 압축된 오디오 조각 a
├─ 압축된 비디오 조각 B
├─ 압축된 오디오 조각 b
├─ 압축된 비디오 조각 C
├─ 압축된 오디오 조각 c
├─ 압축된 비디오 조각 D
└─ 압축된 오디오 조각 d

보이는 것과 같이 mp4는 avi와 다르게 매우 상세하게 box로 분리하여 설계되어 있다.

mp4는 현대 방식이라 구조가 매우 복잡하고 시간 정보를 매우 자세하게 저장할 수 있다.

예를 들어

압축된 영상 조각이 있다고 해보자.

A B C D

AVI는 이런 식으로 단순 저장된다.

1번째 조각 → 0초
2번째 조각 → 1/30초
3번째 조각 → 2/30초
4번째 조각 → 3/30초

즉, 프레임이 일정하게 쭉 간다는 식의 단순한 구조에 가깝다.

반면 MP4는 더 자세하게 저장할 수 있다.

A → 0.000초에 보여줌
B → 0.033초에 보여줌
C → 0.066초에 보여줌
D → 0.100초에 보여줌

그래서, avi는 현대적인 코덱과 호환이 되지 않는 경우가 많다. 그래서 보통 현대적인 코덱은 복잡한 구조를 정리할 수 있는 mp4를 많이 사용한다.

avi, mp4와 audio codecs, video codecs

비디오 코덱 설명 AVI와 궁합
MJPEG 프레임 하나하나를 JPEG처럼 압축 좋음
Xvid 예전 AVI 영상에서 많이 사용 좋음
DivX 예전 영화/동영상 파일에서 많이 사용 좋음
MPEG-4 Part 2 Xvid/DivX 계열과 관련 좋음
DV 캠코더 계열 영상 가능
Uncompressed 압축 거의 안 함 가능, 대신 용량 큼
H.264 현대 코덱 가능은 하지만 비추천
H.265 더 최신 코덱 거의 비추천
오디오 코덱 설명 AVI와 궁합
PCM 압축 안 된 원본 소리 좋음
MP3 오래되고 호환성 좋은 압축 오디오 좋음
AC3 돌비 디지털 계열 가능
WMA 윈도우 계열 오디오 가능하지만 환경 의존

그래서 AVI는 보통 다음과 같은 조합을 사용한다.

AVI + Xvid + MP3

AVI + DivX + MP3

AVI + MJPEG + PCM

AVI + DV + PCM


비디오 코덱 설명 MP4와 궁합
H.264 / AVC 가장 흔하고 호환성 좋음 매우 좋음
H.265 / HEVC 용량을 더 줄일 수 있음 좋음, 단 디코더 필요
MPEG-4 Part 2 예전 MPEG-4 계열 가능
AV1 최신 고효율 코덱 가능하지만 환경 의존
H.266 / VVC 차세대 코덱 가능성은 있지만 호환성 낮음
오디오 코덱 설명 MP4와 궁합
AAC MP4에서 가장 흔한 오디오 코덱 매우 좋음
MP3 오래된 오디오 코덱 가능
ALAC Apple 무손실 오디오 가능
AC3 돌비 디지털 가능
E-AC3 향상된 돌비 디지털 가능
Opus 최신 오디오 코덱 가능하지만 환경 의존

그래서 MP4는 보통 다음과 같은 조합을 사용한다.

MP4 + H.264 + AAC

MP4 + H.265 + AAC

MP4 + AV1 + Opus

MP4 + MPEG-4 Part 2 + AAC

Related records

읽던 위치가 있어요.
확대 이미지