홈 › 2장 미디어 파일 이해

2.3 MOV와 MP4 - Atom/Box 구조와 faststart

QuickTime MOV와 ISO MP4가 공유하는 Atom/Box 구조, moov와 mdat의 위치가 재생에 미치는 영향, 프래그먼트 MP4와 웹 재생 최적화를 설명합니다.

최종 수정 2026-10-28 · 읽는 시간 약 4분 · 운영 프리즘(Prism) · 편집 원칙

#같은 뿌리의 두 포맷

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 파일 형식(브랜드) 선언 — isom, mp42, qt 등 moov 영화 전체 메타데이터 (재생에 필요한 목차) mvhd trak트랙(비디오 / 오디오 / 타임코드 각각) mdia › minf › stbl stsd(코덱) stts(시간) stsz(크기) stco(위치) stss(키프레임) mdat 실제 압축된 영상·오디오 데이터 (매우 큼)

핵심 상자는 세 가지입니다.

  • 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 트랙 보존 여부를 확인해야 합니다.