Multimedia Forensic/Multimedia File Structure

MP4 File Structure

수분_ 2024. 7. 4. 14:29

INDEX

 

1. Introduce

2. MP4 File Structure

3. Reference


 

 

 

1. Introduce

들어가기에 앞서 MP4 파일 구조에 대해 알아보고 이후 test.MP4 파일에 대해

 

  • 인코딩 되지 않은 test.MP4
  • Audio를 제거한 test-audio.MP4
  • 자막을 동영상과 일체화한 test+sub.MP4
  • 자막을 동영상과 일체화하고 Audio를 제거한 test+sub-audio.MP4

 

로 나누어서 분석을 진행했으나 내용이 많은 관계로 분석내용은 바로 뒷 포스팅에 작성할 것임을 알린다.

 

추가로 MP4와 SMI 확장자 형태의 자막 파일을 사용했다. 

 

 

 


 

 

 

2. MP4 File Structure

박스(box)

 

파일의 기본 단위로 크기와 타입, 데이터를 가진다.

박스의 최소 크기는 8byte이다.

 

  • Size : 32bit , box 의 크기
  • Type : 32bit , box 의 이름 

 

크기는 크기와 타입 필드를 포함한 박스의 전체 크기이다.

데이터는 타입에 따른 데이타나 자식 박스(child box)가 올 수 있다. (예전에는 atom으로 불렸다.)

 

파싱 순서는 다음과 같다.

1. 파일 오픈
2. 헤더 읽기
2-1. 4byte 읽어 사이즈 확인( 1인 경우 사이즈 필드가 8byte 임)
2-2. 4byte 읽어 타입 저장
3. Atom 확인
4. Atom 파싱 루틴
5. 2~4 반복

 

 

 

MP4 파일 구조

MP4 파일은 데이타와 메타데이타 박스를 구성할 수 있는 다양한 방법을 제공한다. 

 

더불어 MP4는 공식적으로 ISO/IEC 14496-14:2003 MPEG-4의 일부 규정된 멀티미디어 컨테이너 포맷이다.

 

 

크게 3가지로 나눌 수 있다. ftyp, moov, mdat.

 

또한 기본구조는 다음과 같다.

 

  • ftyp : 파일의 호환성을 확인하는 파일 타입 박스 (file type box)
  • moov : 미디어의 모든 메타 데이타를 저장하는 무비 박스, meta data 시작 (movie box)
    • mvhd: 무비 헤더 박스, movie 정보 (movie header box)
    • iods: IOD (Object Descrptor)
    • trak : 무비 안의 단일 트랙을 정의하는 박스, 트랙 시작 (track box)
      • tkhd : 트랙의 특성을 기술, 트랙 헤더 (track header box)
      • tref: 트랙 메타 처리시 참조할 트랙 (Track Reference)
      • edts : (edit box)
        • elst : (edit list box)
          • mdia : 트랙의 미디어 타입과 샘플 데이터, 미디어 시작 (media box)
            • mdhd : 미디어의 특성을 기술, 미디어와 관련한 일반적 내용 (media header box)
            • hdlr : 미디어 타입 (handler reference box)
            • minf : 미디어 정보, 샘플 데이터를 얻기 위한 정보  (media information box)
            • vmhd: 미디어 타입 (Media Information Header)
            • dinf: 데이터 정보, 샘플 데이터의 위치를 얻기 위한 정보 (Data Information
                • dref: 파일 내의 존재 여부 및 파일명 (Data Reference)
                • hdlr : (handler reference box)
                • stbl : 샘플 테이블 (sample table box)
                  • stsd : 트랙의 디코딩에 필요한 코덱의 정보 (sample description box)
                    • esds: h.263 es descriptor (ES Description)
                    • avcC: AVC Configuration Box
                    • MPEG4 Extension Descriptor Box
                  • stts : 샘플의 시간 (time-to-sample box)
                  • stsz : 청크 내 샘플의 크기 (sample size box)
                  • stsc : 청크 내 샘플의 수 (sample to chunk box)
                  • stco : 청크의 위치 (chunk offset box)
                  • stbl: (Sync Sample)  
                    • trak
                      • mdat : 실제 미디어를 저장하는 미디어 데이타 박스(media data box)

 

moov와 mdat는 위 그림과 달리 순서가 바뀌어도 상관이 없다.


그러나 moov가 mdat 앞에 있으면 플레이어가 비디오/오디오 데이터를 재생하기 전에 이것에 관한 더 많은 정보를 얻을 수 있다.


때문에 moov가 앞에 위치하는 것이 좋다.


일부 플레이어는 HTTP Progressive Download를 이용하는 경우, moov가 앞에 있지 않으면 재생이 되지 않는다.

 

인코딩을 하면 mdat가 moov 앞에 위치해진다. 

 

 

 

이후에는 MP4 파일 구조에 대한 전체적인 도식화 그림과 각 Box 별 세부 내용을 살펴보겠다.

 

 

 

 

 

 

>>> 각 Box 별 세부 내용 및 기본 MP4(k3g)관련 데이터

 

MEDIA DATA : mdat

Type
32bits
“mdat”
Data
Variable
코딩된 Video 및 Audio data와 hint sample

 

 

Movie Box : moov

Size
32bits
Movie Atom의 size
Type
32bits
“moov”

 

 

Movie Header Box : mvhd

Size
32bits
Movie Header Atom의 size
Type
32bits
“mvhd”
Version
8bits
Movie Header Atom의 version
(1이면 8byte시간, 0이면 4byte시간 사용)
Flags
24bits
0
Creation-time
64bits 또는
32bits
File이 만들어진 시간
Modification-time
64bits 또는
32bits
File이 수정된 시간
Timescale
64bits 또는
32bits
File의 timescale
Duration
64bits 또는
32bits
File의 play 시간 (timescale기준)
Reserved
32bits
0x00010000
Reserved
16bits
0x0100
Reserved
16bits
0
Reserved
32bits * 2
0
Reserved
32bits * 9
0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x4000000
Reserved
32bits * 6
0
Next-track-ID
32bits
사용가능한 다음 track-ID 번호

 

 

IOD Box : iods

Size
32bits
IOD Atom의 size
Type
32bits
“iods”
Version
8bits
0
Flag
24bits
0
ObjectDescriptor
Variable
Initial Object Descriptor

 

 

ObjectDescriptor

Tag
8bits
0x10
Length
32bits
0x80808019
ObjectDescriptorID
10bits
1
URL_Flag
1bit
0
IncludeInlineProfile
LevelFlag
1bit
0
Reserved
4bits
0xF
ODProfile
LevelIndication
8bits
0xFF
SceneProfile
LevelIndication
8bits
0xFF
AudioProfile
LevelIndication
8bits
0x01
VisualProfile
LevelIndication
8bits
0x03
GraphicsProfile
LevelIndication
8bits
0xFF
Tag
8bits
0x0E
Length
32bits
0x80808004
ES_ID
32bits
OD 혹은 BIFS Track의 ID
Tag
8bits
0x0E
Length
32bits
0x80808004
ES_ID
32bits
OD 혹은 BIFS Track의 ID

 

 

VIDEO TRACK : track

Size
32bits
Track Atom의 size
Type
32bits
“trak”

 

 

Track Header Box : tkhd

Size
32bits
Track Header Atom의 size
Type
32bits
“tkhd”
Version
8bits
Track Header Atom의 version
(1이면 8byte시간, 0이면 4byte시간 사용)
Flags
24bits
0x000001
Creation-time
64bits 또는
32bits
Track이 만들어진 시간
Modification-time
64bits 또는
32bits
Track이 수정된 시간
Track-ID
32bits
Track의 ID값
Reserved
32bits
0
Duration
32bits
Track의 play 시간 (movie timescale기준)
Reserved
32bits * 3
0
Reserved
16bits
0
Reserved
16bits
0
Reserved
32bits * 9
0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0,
0x40000000
Reserved
32bits
0x01400000
Reserved
32bits
0x00F00000

 

 

Media Box : mdia

Size
32bits
Media Atom의 size
Type
32bits
“mdia”

 

 

Media Header Box : mdhd

Size
32bits
Media Header Atom의 size
Type
32bits
“mdhd”
Version
8bits
Track Header Atom의 version
(1이면 8byte시간, 0이면 4byte시간 사용)
Flags
24bits
0
Creation-time
64bits 또는
32bits
Media가 만들어진 시간
Modification-time
64bits 또는
32bits
Media가 수정된 시간
Timescale
32bits
Media의 timescale
Duration
64bits 또는
32bits
Media의 play 시간 (media timescale기준)
Pad
1bit
0
language
5bits * 3
packed ISO-639-2/T language code
reserved
16bits
0

 

 

Handler Box : hdlr

Size
32bits
Handler Atom의 size
Type
32bits
“hdlr”
Version
8bits
0
Flags
24bits
0
Reserved
32bits
0
Handler-type
32bits
“vide”
Reserved
8bits * 12
0
String
var
“vide”

 

 

Media Information Box : minf

Size
32bits
Media Information Atom의 size
Type
32bits
“minf”

 

 

Media Information Header Box : vmhd

Size
32bits
Media Information Header Atom의 size
Type
32bits
“vmhd”
Version
8bits
0
Flags
24bits
1
Reserved
64bits
0

 

 

Data Information Box : dinf

Size
32bits
Data Information Atom의 size
Type
32bits
“dinf”

 

 

Data Reference Box : dref

Size
32bits
Data Reference Atom의 size
Type
32bits
“dref”
Version
8bits
0
Flags
24bits
0
Entry-count
32bits
1
Size
32bits
Data Entry Atom의 size
Type
32bits
“url ”
Version
8bits
0
Flags
24bits
0x000001

 

 

Sample Table Box : stbl

Size
32bits
Sample Table Atom의 size
Type
32bits
“stbl”

 

 

Time To Sample Box : stts

Size
32bits
Time To Sample Atom의 size
Type
32bits
“stts”
Version
8bits
0
Flags
24bits
0
Entry-count
32bits
Sample-count 와 Sample-delta pair의 전체 개수
Sample-count
32bits
같은 delta값을 가지는 연속된 sample개수
Sample-delta
32bits
Sample의 duration (media timescale기준)
<계속>
Sample-count
32bits
같은 delta값을 가지는 연속된 sample개수
Sample-delta
32bits
Sample의 duration (media timescale기준)

 

 

Sample Description Box : stsd

Size
32bits
Sample Description Atom의 size
Type
32bits
“stsd”
Version
8bits
0
Flag
24bits
0
Entry-count
32bits
1
Size
32bits
Sample Entry Atom의 size
Type
32bits
“mp4v”
Reserved
8bits * 6
0
Data-reference-index
16bits
1
Reserved
32bits * 4
0
Reserved
32bits
0x014000F0
Reserved
32bits
0x00480000
Reserved
32bits
0x00480000
Reserved
32bits
0
Reserved
16bits
1
Reserved
8bits * 32
0
Reserved
16bits
24
Reserved
16bits
-1
ESDAtom
Variable
ES Descriptor

 

 

H.264 Sample Description : stsd

Size
32bits
Sample Description Box의 size
Type
32bits
“stsd”
Version
8bits
0
Flag
24bits
0
Entry-count
32bits
1  개수 (아래의 회색 영역이 이 개수만큼 반복된다)
Size
32bits
Sample Entry Box의 size
Type
32bits
“avc1”
Reserved
8bits * 6
0
Data-reference-index
16bits
1
Pre_defined
16bits
0
Reserved
16bits
0
Pre_defined
32bits * 3
0
Width
16bits
Maximum width, in pixels of the stream
Height
16bits
Maximum height, in pixels of the stream
Horizresolution
32bits
0x00480000 //72 dpi
Vertiresolution
32bits
0x00480000 //72dpi
Reserved
32bits
0
Frame_count
16bits
1
compressorname
8bits * 32
0
Depth
16bits
0x0018
Pre_defined
16bits
-1
AVCConfigurationBox
Variable
AVCVideoConfigurationRecord
MPEG4ExtensionDescriptorsBox
Variable
Descriptor //Optional

 

 

ES Description Box : esds

Size
32bits
ESD Atom의 size
Type
32bits
“esds”
Version
8bits
0
Flags
24bits
0
Tag
8bits
0x03
Length
8/16/24/32bits(가변)
ES Descriptor의 length
ES_ID
16bits
0
StreamDependence
Flag
1bit
0
URL_Flag
1bit
0
OCRstreamFlag
1bit
0
StreamPriority
5bit
0
Tag
8bits
0x04
Length
8/16/24/32bits(가변)
Decoder Config Descriptor의 length
ObjectType
Indication
8bits
0x20
StreamType
6bits
0x04
Upstream
1bits
0
Reserved
1bits
1
BufferSizeDB
24bits
Decoding Buffer의 size
MaxBitrate
32bits
최대 bitrate
AvgBitrate
32bits
평균 bitrate
Tag
8bits
0x05
Length
8/16/24/32bits(가변)
Decoder Specific Info의 length
Info data
Variable
VisualObjectSequence, VisualObject 전부와Group_of_VideoObjectPlane과
VideoObjectPlane을 제외한
VideoObjectLayer를 포함
Tag
8bits
0x06
Length
8/16/24/32bits(가변)
SL Config Descriptor의 length
Predefined
8bits
2

 

 

Sample Size Box : stsz

Size
32bits
Sample Size Atom의 size
Type
32bits
“stsz”
Version
8bits
0
Flags
24bits
0
Sample-size
32bits
0
Sample-count
32bits
전체 Sample의 개수
Entry-size
32bits
첫번째 Sample의 size
<계속>
Entry-size
32bits
마지막 Sample의 size

 

 

Sample To Chunk Box : stsc

Size
32bits
Sample To Chunk Atom의 size
Type
32bits
“stsc”
Version
8bits
0
Flags
24bits
0
Entry-count
32bits
first-chunk, samples-per-chunk, sample-description-index의 전체 개수
First-chunk
32bits
Chunk당 sample개수와 sample description index가 같은 연속된 chunk중 첫번째 chunk의 index
Sample-per-chunk
32bits
Chunk당 sample의 개수
Sample-description-index
32bits
1
<계속>
First-chunk
32bits
Chunk당 sample개수와 sample description index가 같은 연속된 chunk중 첫번째 chunk의 index
Sample-per-chunk
32bits
Chunk당 sample의 개수
Sample-description-index
32bits
1

 

 

Chunk Offset Box : stco

Size
32bits
Chunk Offset Atom의 size
Type
32bits
“stco”
Version
8bits
0
Flags
24bits
0
Entry-count
32bits
전체 Chunk의 개수
Chunk-offset
32bits
File의 처음으로부터 첫번째 chunk까지의 offset
<계속>
Chunk-offset
32bits
File의 처음으로부터 마지막 chunk까지의 offset

 

 

Sync Sample Box : stss

Size
32bits
Sync Sample Atom의 size
Type
32bits
“stss”
Version
8bits
0
Flags
24bits
0
Entry-count
32bits
전체 Sync Sample의 개수
Sample Number
32bits
Sync Sample Number
<계속>
Sample Number
32bits
Sync Sample Number

 

 

H.264 AVC Configuration Box : avcC

Size
32bits
AVC Configuration Box의 size
Type
32bits
“avcC”
Configuration Version
8bits
1
AVC Profile indication
8bits
Profile code
Profile compatibility
8bits
Compatible한 profile을 나타냄
AVC Level indication
8bits
Level code
Reserved
6bits
0b111111
Length Size Minus One
2bits
NALU Length field의 byte 수 - 1
Reserved
3bits
0b111
Num of Sequence Parameter Sets
5bits
SPS의 개수
Sequence Parameter Set Length
16bits
Parameter set NALU의 길이
Sequence Parameter Set NAL Unit
Variable
SPS NAL Unit
<계속>
Sequence Parameter Set Length
16bits
Parameter set NALU의 길이
Sequence Parameter Set NAL Unit
Variable
SPS NAL Unit
Num of Picture Parameter Sets
8bits
PPS의 개수
Picture Parameter Set Length
16bits
Parameter set NALU의 길이
Picture Parameter Set NAL Unit
Variable
PPS NAL Unit
<계속>
Picture Parameter Set Length
16bits
Parameter set NALU의 길이
Picture Parameter Set NAL Unit
Variable
PPS NAL Unit

 


 

Audio Track : trak

Size
32bits
Track Atom의 size
Type
32bits
“trak”

 

 

Track Header Box : tkhd

Size
32bits
Track Header Atom의 size
Type
32bits
“tkhd”
Version
8bits
Track Header Atom의 version
(1이면 8byte시간, 0이면 4byte시간 사용)
Flags
24bits
0x000001
Creation-time
64bits 또는
32bits
Track이 만들어진 시간
Modification-time
64bits 또는
32bits
Track이 수정된 시간
Track-ID
32bits
Track의 ID값
Reserved
32bits
0
Duration
32bits
Track의 play 시간 (movie timescale기준)
Reserved
32bits * 3
0
Reserved
16bits
0x0100
Reserved
16bits
0
Reserved
32bits * 9
0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0,
0x40000000
Reserved
32bits
0
Reserved
32bits
0

 

 

Media Box : mdia

Size
32bits
Media Atom의 size
Type
32bits
“mdia”

 

 

Media Header Box : mdhd

Size
32bits
Media Header Atom의 size
Type
32bits
“mdhd”
Version
8bits
Track Header Atom의 version
(1이면 8byte시간, 0이면 4byte시간 사용)
Flags
24bits
0
Creation-time
64bits 또는
32bits
Media가 만들어진 시간
Modification-time
64bits 또는
32bits
Media가 수정된 시간
Timescale
32bits
Media의 timescale
Duration
64bits 또는
32bits
Media의 play 시간 (media timescale기준)
Pad
1bit
0
language
5bits * 3
packed ISO-639-2/T language code
reserved
16bits
0

 

 

Handler Box : hdlr

Size
32bits
Handler Atom의 size
Type
32bits
“hdlr”
Version
8bits
0
Flags
24bits
0
Reserved
32bits
0
Handler-type
32bits
“soun”
Reserved
8bits * 12
0
String
Var
“soun”

 

 

Media Information Box : minf

Size
32bits
Media Information Atom의 size
Type
32bits
“minf”

 

 

Media Information Header Box : smhd

Size
32bits
Media Information Header Atom의 size
Type
32bits
“smhd”
Version
8bits
0
Flags
24bits
0
Reserved
32bits
0

 

 

Data Reference Box :dref

Size
32bits
Data Reference Atom의 size
Type
32bits
“dref”
Version
8bits
0
Flags
24bits
0
Entry-count
32bits
1
Size
32bits
Data Entry Atom의 size
Type
32bits
“url ”
Version
8bits
0
Flags
24bits
0x000001

 

 

Sample Table Box : stbl

Size
32bits
Sample Table Atom의 size
Type
32bits
“stbl”

 

 

Time To Sample Box : stts

Size
32bits
Time To Sample Atom의 size
Type
32bits
“stts”
Version
8bits
0
Flags
24bits
0
Entry-count
32bits
Sample-count 와 Sample-delta pair의 전체 개수
Sample-count
32bits
같은 delta값을 가지는 연속된 sample개수
Sample-delta
32bits
Sample의 duration (media timescale기준)
<계속>
Sample-count
32bits
같은 delta값을 가지는 연속된 sample개수
Sample-delta
32bits
Sample의 duration (media timescale기준)

 

 

Sample Description Box : stsd

Size
32bits
Sample Description Atom의 size
Type
32bits
“stsd”
Version
8bits
0
Flag
24bits
0
Entry-count
32bits
1
Size
32bits
Sample Entry Atom의 size
Type
32bits
“mp4a”
Reserved
8bits * 6
0
Data-reference-index
16bits
1
Reserved
32bits * 2
0
Reserved
16bits
2
Reserved
16bits
16
Reserved
32bits
0
Time-scale
16bits
Sample의 timescale
Reserved
16bits
0
ESDAtom
Variable
ES Descriptor

 

 

ESD Box :esds

Size
32bits
ESD Atom의 size
Type
32bits
“esds”
Version
8bits
0
Flags
24bits
0
Tag
8bits
0x03
Length
8/16/24/32bits(가변)
ES Descriptor의 length
ES_ID
16bits
0
StreamDependence
Flag
1bit
0
URL_Flag
1bit
0
OCRstreamFlag
1bit
0
StreamPriority
5bit
0
Tag
8bits
0x04
Length
8/16/24/32bits(가변)
Decoder Config Descriptor의 length
ObjectType
Indication
8bits
AAC : 0x40,
MP3 : 0x6B
EVRC/QCELP/AMR/G.723의 경우
별도의 SampleEntry로 지원
StreamType
6bits
0x05
Upstream
1bits
0
Reserved
1bits
1
BufferSizeDB
24bits
Decoding Buffer의 size
MaxBitrate
32bits
최대 bitrate
AvgBitrate
32bits
평균 bitrate
Tag
8bits
0x05
Length
8/16/24/32bits(가변)
Decoder Specific Info의 length
Info data
variable
AudioObjectType, samplingFrequencyIndex,
(SamplingFrequency), channelConfiguration,
epConfig를 포함
Tag
8bits
0x06
Length
8/16/24/32bits(가변)
SL Config Descriptor의 length
Predefined
8bits
2

 

 

Sample Size Box : stsz

Size
32bits
Sample Size Atom의 size
Type
32bits
“stsz”
Version
8bits
0
Flags
24bits
0
Sample-size
32bits
0
Sample-count
32bits
전체 Sample의 개수
Entry-size
32bits
첫번째 Sample의 size
<계속>
Entry-size
32bits
마지막 Sample의 size

 

 

Sample To Chunk Box : stsc

Size
32bits
Sample To Chunk Atom의 size
Type
32bits
“stsc”
Version
8bits
0
Flags
24bits
0
Entry-count
32bits
first-chunk, samples-per-chunk, sample-description-index의 전체 개수
First-chunk
32bits
Chunk당 sample개수와 sample description index가 같은 연속된 chunk중 첫번째 chunk의 index
Sample-per-chunk
32bits
Chunk당 sample의 개수
Sample-description-index
32bits
1
<계속>
First-chunk
32bits
Chunk당 sample개수와 sample description index가 같은 연속된 chunk중 첫번째 chunk의 index
Sample-per-chunk
32bits
Chunk당 sample의 개수
Sample-description-index
32bits
1

 

 

Chunk Offset Box : stco

Size
32bits
Chunk Offset Atom의 size
Type
32bits
“stco”
Version
8bits
0
Flags
24bits
0
Entry-count
32bits
전체 Chunk의 개수
Chunk-offset
32bits
File의 처음으로부터 첫번째 chunk까지의 offset
<계속>
Chunk-offset
32bits
File의 처음으로부터 마지막 chunk까지의 offset
Size
32bits
Sync Sample Atom의 size
Type
32bits
“stss”
Version
8bits
0
Flags
24bits
0
Entry-count
32bits
전체 Sync Sample의 개수
Sample Number
32bits
Sync Sample Number
<계속>
Sample Number
32bits
Sync Sample Number

 

 

 

 


 

 

 

3. Reference

 

[MP4 file format summary]

https://www.programmersought.com/article/57353932020/ 

 

MP4 file format summary - Programmer Sought

As a mainstream media file for video surveillance, mp4 files are not complicated in frame structure. They are mainly composed of a series of boxes. Here is a brief analysis. Software for viewing mp4 files: MP4 Reader. 1. The overall structure of the mp4 fi

www.programmersought.com

 

 

[yesing1]

https://blog.naver.com/yesing1/70096278829

 

mp4파일 시스템 구조, mp4파일 구조

mp4 파일 시스템 기본 구조 Movie (moov) : meta data 시작     Movie Header (mvhd) : ...

blog.naver.com