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