JT1078.FMp4
avcC
avcC
length:EntryCount
stco
stco
length:EntryCount
clap
clap
4, 8 or 16
length:SampleCount
DepOn:field_size=>DataType
ctts
ctts
version == 1
16-1
16-15
ISO-639-2/T language code
dinf
dinf
dref
dref
dref
length:EntryCount
sample_count is taken from the sample_count in the Sample Size Box ('stsz').
length:EntryCount
length:EntryCount
length:NumChannelsInSessionGroup
以null结尾
ftyp 盒子相当于就是该 mp4 的纲领性说明。即,告诉解码器它的基本解码版本,兼容格式。简而言之,就是用来告诉客户端,该 MP4 的使用的解码标准。通常,ftyp 都是放在 MP4 的开头。
ftyp
因为兼容性一般可以分为推荐兼容性和默认兼容性。这里 major_brand 就相当于是推荐兼容性。通常,在 Web 中解码,一般而言都是使用 isom 这个万金油即可。如果是需要特定的格式,可以自行定义。
4位
最低兼容版本
4位
和MajorBrand类似,通常是针对 MP4 中包含的额外格式,比如,AVC,AAC 等相当于的音视频解码格式。
4位*n
moof
mdat
填充值
填充数量
hdlr
hdlr
0, 4, 8
0, 4, 8
0, 4, 8
version == 1
if (version == 1) 16-12
if (version == 1) 16-4
1byte 8-1
1byte 8-7
AssignmentType == 0 || assignment_type == 1
assignment_type == 1
assignment_type == 4
mdia
mdia
mdhd
hdlr
minf
mdat
mdat
过滤掉AUD/SPS/PPS NAL
然后将其他NAL写入Data中
Filter out AUD/SPS/PPS NAL units from your stream
Write you converted NAL units into the MDAT box
mdhd
mdhd
ISO-639-2/T language code
ref:doc\fmp4\ISO Language Codes.txt
und-undetermined
minf
minf
vmhd
dinf
stbl
moov
moov
mvhd
trak
mvex
udta
mvex
mvex
mehd
trex
mehd
mehd
moof
moof
mfhd
traf
mfhd
mfhd
mfra
mfra
tfra
mfro
mfro
mfro
mfra 盒子大小
mvhd
mvhd
btrt
btrt
pasp
pasp
if (version==0)
length:entry_count
length:entry_count
default_sample_info_size==0
length:sample_count
sdtp
sdtp
is taken from the sample_count in the Sample Size Box ('stsz') or Compact Sample Size Box(‘stz2’).
stsd
stsd
if (version==1)
stsz
stsz
if (sample_size==0)
length:sample_count
stbl
stbl
stsd
stts
stss
ctts
stsz
stsc
stco
stsc
stsc
sbgp
sbgp
version == 1
sidx
sidx
pts
if(version==0)
version==0 32 bit
version>0 64 bit
4byte 32 - 1
4byte 32 - 31
ReferencedSize=(moof size) + (mdat size)
4byte 32 - 1
4byte 32 - 3
4byte 32 - 28
styp
styp
因为兼容性一般可以分为推荐兼容性和默认兼容性。这里 major_brand 就相当于是推荐兼容性。通常,在 Web 中解码,一般而言都是使用 isom 这个万金油即可。如果是需要特定的格式,可以自行定义。
4位
最低兼容版本
4位
和MajorBrand类似,通常是针对 MP4 中包含的额外格式,比如,AVC,AAC 等相当于的音视频解码格式。
4位*n
4btye 32 - 30
4btye 32 - 2
length:Length
subs
subs
version == 1 uint32
version != 1 uint16
length:SubSegmentCount
length:RangesCount
32 - 8
32 - 4
length:ItemCount
stss
stss
stts
stts
trak
trak
tkhd
mdia
trex
trex
tfdt
tfdt
traf
traf
tfhd
sdtp
trun
tfdt
sbgp
subs
tfhd
tfhd
tfhd
TFHD_FLAG_BASE_DATA_OFFSET
TFHD_FLAG_SAMPLE_DESCRIPTION_INDEX
TFHD_FLAG_DEFAULT_DURATION
TFHD_FLAG_DEFAULT_SIZE
H.264 NALU SIZE
TFHD_FLAG_DEFAULT_FLAGS
MOV_AUDIO == handler_type ? TFHD_FLAG_AUDIO_TPYE : TFHD_FLAG_VIDEO_TPYE;
tfra
tfra
26bit
2bit
2bit
2bit
(moof+mdta)N
需要定位到当前 moof offset
tkhd
tkhd
tkhd
trun
trun
201 205 1
201 0010 0000 0001
205 0010 0000 0101
1 0000 0000 0001
tr_flags 是用来表示下列 sample 相关的标识符是否应用到每个字段中:
0x000001-0000 0000 0001: data-offset-present,只应用 data-offset
0x000004-0000 0000 0100: 只对第一个 sample 应用对应的 flags。剩余 sample flags 就不管了。
0x000100-0001 0000 0000: 这个比较重要,表示每个 sample 都有自己的 duration,否则使用默认的
0x000200-0010 0000 0000: 每个 sample 有自己的 sample_size,否则使用默认的。
0x000400-0100 0000 0000: 对每个 sample 使用自己的 flags。否则,使用默认的。
0x000800-1000 0000 0000: 每个 sample 都有自己的 cts 值
0x000f01-1111 0000 0001
可选的
用来表示和该moof配套的mdat中实际数据内容距moof开头有多少byte
相当于就是 moof.byteLength + mdat.headerSize(8)
可选的
可选的
length:SampleCount
cts
version == 0
0:uint
>0:int
uri
uri
uriI
uriI
vmhd
vmhd
null
Video track
Audio track
Hint track
Timed Metadata track
Auxiliary Video track
fmp4
stream data
ftyp
moov
moof 1
mdat 1
...
moof n
mdat n
mfra
ftyp
moov
fboxs
mfra
日期限制于2000年
fmp4 FLAG_SEGMENT
key frame
I frame
p b frame
TKHD_FLAG_ENABLED
TKHD_FLAG_IN_MOVIE
TKHD_FLAG_IN_PREVIEW
TFHD_FLAG_BASE_DATA_OFFSET
TFHD_FLAG_SAMPLE_DESC
TFHD_FLAG_AUDIO_TPYE
TFHD_FLAG_VIDEO_TPYE
TFHD_FLAG_SAMPLE_DUR
TFHD_FLAG_SAMPLE_SIZE
TFHD_FLAG_SAMPLE_FLAGS
TFHD_FLAG_DUR_EMPTY
TFHD_FLAG_DEFAULT_BASE_IS_MOOF
TRUN_FLAGS_DATA_OFFSET
TRUN_FLAGS_FIRST_FLAG
TRUN_FLAGS_DURATION
TRUN_FLAGS_SIZE
TRUN_FLAGS_FLAGS
TRUN_FLAGS_CTS_OFFSET
FMp4编码
fmp4
stream data
ref: https://www.w3.org/TR/mse-byte-stream-format-isobmff/#movie-fragment-relative-addressing
编码ftyp盒子
编码moov盒子
styp
编码其他视频数据盒子
注意:固定I帧解析,延迟一个I帧的时间
I P P P P
I P P P P
I P P P P
编码首帧
ftyp moov
编码其他视频数据盒子
styp sidx moof mdat
...
styp sidx moof mdat
unsigned int(8)
bit(24)
ref
盒子大小
盒子类型
avc1
avc1
avcC
btrt
HintSampleEntry
HintSampleEntry
SampleEntry
SampleEntry
mett
mett
optional
btrt
optional
urim
urim
uri
uriI
optional
btrt
optional
VisualSampleEntry
VisualSampleEntry
clap
optional
pasp
optional
metx
metx
optional
Namespace
optional
optional