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