2.3 MOV와 MP4 - Atom/Box 구조와 faststart
QuickTime MOV와 ISO MP4가 공유하는 Atom/Box 구조, moov와 mdat의 위치가 재생에 미치는 영향, 프래그먼트 MP4와 웹 재생 최적화를 설명합니다.
#같은 뿌리의 두 포맷
MOV는 애플의 QuickTime 파일 포맷이고, MP4(ISO/IEC 14496-14)는 QuickTime 포맷을 토대로 만든 ISO 기본 미디어 파일 포맷(ISO/IEC 14496-12, ISOBMFF)에 기반한 파일 포맷입니다. 그래서 두 포맷은 같은 구조(Atom 또는 Box) 를 쓰며, H.264/AAC가 들어 있는 경우 재래핑만으로 서로 변환할 수 있습니다.
차이는 용도에서 갈립니다.
| 구분 | MOV | MP4 |
|---|---|---|
| 정체성 | QuickTime(애플) | ISO 국제 표준 |
| 주요 사용처 | 편집 중간 파일(ProRes, DNxHD) | 웹, 모바일, 최종 납품(H.264/H.265) |
| 타임코드 | 타임코드 트랙(tmcd)을 일반적으로 지원 |
표준 지원이 제한적, 도구에 따라 다름 |
| 코덱 | 매우 다양 | 상대적으로 제한(표준에 등록된 코덱 위주) |
#Atom(Box) 구조
파일은 크기(4바이트) + 종류(4글자) + 내용으로 이루어진 "상자"의 연속입니다. 상자 안에 다른 상자가 들어 있는 트리 구조입니다.
핵심 상자는 세 가지입니다.
ftyp: 파일 맨 앞에서 "나는 이런 브랜드의 파일이다"라고 선언합니다.moov: 재생에 필요한 모든 정보의 목차입니다. 트랙 구성, 코덱, 전체 길이, 각 프레임(샘플)의 크기와 파일 내 위치가 들어 있습니다.mdat: 실제 영상·오디오 데이터가 들어 있는 상자입니다. 파일 크기의 대부분을 차지합니다.
moov의 stbl(Sample Table) 아래에는 샘플(프레임) 단위의 정보가 표로 정리되어 있습니다.
| 상자 | 역할 |
|---|---|
stsd |
샘플 설명 — 코덱 종류와 설정 |
stts |
각 샘플의 재생 시간 길이 |
stsz |
각 샘플의 바이트 크기 |
stsc / stco |
샘플이 어떤 청크에 있고, 청크가 파일의 어디에서 시작하는가 |
stss |
키프레임(Sync Sample) 목록 |
탐색(Seek)은 이 표를 이용합니다. "37.5초로 이동"을 요청하면 stts로 샘플 번호를 구하고, stss로 가장 가까운 키프레임을 찾은 뒤, stsc/stco/stsz로 파일 내 위치를 계산해 읽는 방식입니다.
#moov가 앞에 있어야 하는 이유
moov가 파일 끝에 있으면 플레이어는 재생을 시작하기 전에 먼저 그것을 읽어야 합니다. 서버와 플레이어가 HTTP Range 요청을 지원하면 끝부분만 따로 요청할 수 있지만, 지원하지 않으면 파일 전체를 받은 뒤에야 재생이 시작될 수 있고, 지원하더라도 추가 요청 때문에 시작이 늦어질 수 있습니다. 많은 인코더(특히 라이브 녹화나 후처리 전 상태)는 mdat을 먼저 쓰고 moov를 마지막에 쓰기 때문입니다.
느린 시작: ftyp | mdat (큰 데이터) | moov ← 다 받아야 재생
빠른 시작: ftyp | moov | mdat (큰 데이터) ← 앞부분만 받아도 재생
웹 서비스용 MP4는 반드시 moov를 앞쪽으로 옮겨야 합니다. FFmpeg에서는 -movflags +faststart 옵션이 이를 처리합니다.
# 재인코딩 없이 moov만 앞으로 이동
ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4
#프래그먼트 MP4(fMP4)
일반 MP4는 녹화가 끝나야 moov가 완성됩니다. 프래그먼트 MP4는 파일을 moof(조각 메타데이터) + mdat(조각 데이터)의 반복 구조로 만들어, 녹화 중에도 재생할 수 있게 합니다.
ftyp | moov(초기화) | moof | mdat | moof | mdat | moof | mdat ...
HLS·DASH 같은 적응형 스트리밍과 라이브 녹화의 기본 구조이며, 도중에 중단되어도 지금까지의 조각은 재생할 수 있다는 장점이 있습니다.
#MOV 고유의 요소: 타임코드 트랙
방송 소재를 담은 MOV에는 타임코드를 저장하는 별도 트랙(tmcd)이 있는 경우가 많습니다. 비디오 트랙과 별개로 "시작 타임코드와 프레임레이트, 드롭 프레임 여부"를 저장합니다. MP4로 재래핑하면 이 트랙이 사라지거나 다르게 처리될 수 있으므로, 타임코드가 중요한 워크플로우에서는 변환 후 값을 비교해야 합니다.
#직접 확인하기
# 상자 구조 확인 (MP4Box 사용)
MP4Box -info input.mp4
# moov 위치 확인 (ffprobe의 trace 로그에서 상자 순서 확인)
ffprobe -v trace -i input.mp4 2>&1 | grep -E "type:'(ftyp|moov|mdat)'"
두 번째 명령 결과에서 moov가 mdat보다 먼저 나오면 faststart가 적용된 파일입니다.
#정리
- MOV와 MP4는 같은 Atom/Box 구조를 공유합니다.
moov(목차)와mdat(데이터)의 순서가 웹 재생 시작 속도를 좌우하며, 웹용은 faststart가 필수입니다.- 라이브·스트리밍에는 프래그먼트 MP4, 방송 타임코드가 중요한 경우에는
tmcd트랙 보존 여부를 확인해야 합니다.