肇庆东莞网站建设,wordpress自定义数据,深圳有哪些做网站公司,做销售的 都有什么网站一.mp4文件的组织
1. mp4文件的box(ffmpeg中叫atom) mp4是由一系列的box组成的#xff0c;每个box的header是8个字节(4字节的长度,4字节的type) 第一个box比较特殊#xff0c;其type类型为ftyp,还包含一个sub-type
0000000: 0000 0020 6674 7970 6973 6f6d 0000 0200 ... f…
一.mp4文件的组织
1. mp4文件的box(ffmpeg中叫atom) mp4是由一系列的box组成的每个box的header是8个字节(4字节的长度,4字节的type) 第一个box比较特殊其type类型为ftyp,还包含一个sub-type
0000000: 0000 0020 6674 7970 6973 6f6d 0000 0200 ... ftypisom....
0000010: 6973 6f6d 6973 6f32 6176 6331 6d70 3431 isomiso2avc1mp41
0000020: 0000 0008 6672 6565 0609 6f8e 6d64 6174 ....free..o.mdat
0000030: 0000 028c 0605 ffff 88dc 45e9 bde6 d948 ..........E....H
0000040: b796 2cd8 20d9 23ee ef78 3236 3420 2d20 ..,. .#..x264 -
0000050: 636f 7265 2031 3030 202d 2048 2e32 3634 core 100 - H.264
0000060: 2f4d 5045 472d 3420 4156 4320 636f 6465 /MPEG-4 AVC code
0000 0020 6674 7970 -- 第1个box的长度为0x20, typeftyp 6973 6f6d --其sub-typeisom 0000 0008 6672 6565 -- 第2个box的长度为0x08, typefree 0609 6f8e 6d64 6174 -- 第3个box的长度为0x06096F8E, typemdat 由此可以看出第4个box: 0x06096F8E0x080x200x06096FB6处是第4个box 000c ca81 6d6f 6f76 -- 第4个box的长度是0x0cca81, typemoov 1.2 计算文件的大小 所以整个文件的大小为 0x200x080x0x06096F8E0x0cca810x6163A37102119991 congmsi:/work/ffmpeg/ffmpeg-3.0.1$ ls -l ../san.mp4 -rw-rw-r-- 1 cong cong 102119991 Sep 10 2015 ../san.mp4 1.3 关于box-type:
box-type可以是如下一个:
ftyp, mdat, moov, pnot, udta, uuid, moof, free, skip, jP2 , wide, load, ctab, imap, matt, kmat, clip, crgn, sync, chap, tmcd, scpt, ssrc, PICT.
sub-type可以取如下一个:
sub-type which must be one of values: avc1, iso2, isom, mmp4, mp41, mp42, mp71, msnv, ndas, ndsc, ndsh, ndsm, ndsp, ndss, ndxc,ndxh, ndxm, ndxp, ndxs. 1.4总结 一个mov文件就是由ftyp free mdat moov这四个部分组成 ftyp -- 格式 free -- 不关心 mdat -- 音视频数据 moov -- 包含一系列次级box:一个mvhd及多个trak 1.5 如下图所示: 清楚了 二. BOX的具体解析 2.1FileTypeBox-- ftype解析
0000000: 0000 0020 6674 7970 6973 6f6d 0000 0200 ... ftypisom....
0000010: 6973 6f6d 6973 6f32 6176 6331 6d70 3431 isomiso2avc1mp41
0000 0020 6674 7970 -- 第1个box的长度为0x20, typeftyp 6973 6f6d -- major_brand: isom 0000 0200 -- minor_verion: isom的版本号 6973 6f6d 6973 6f32 6176 6331 6d70 3431-- 兼容isom iso2 avc1 mp41这四个协议
ISO14496-12 的 4.3.2 Syntax
aligned(8) class FileTypeBox extends Box(‘ftyp’) { unsigned int(32) major_brand; unsigned int(32) minor_version; unsigned int(32) compatible_brands[]; // to end of the box
}
没有ftyp后面就不知道用什么去解析这个媒体文件 2.2 Free Space Box --free解析 没啥作用
ISO14496-12 的8.24.2 Syntax
aligned(8) class FreeSpaceBox extends Box(free_type) { unsigned int(8) data[];
}
2.3 Media Data Box --mdat解析 这个box里面全部都是数据
ISO14496-12 的8.2.2 Syntax
aligned(8) class MediaDataBox extends Box(‘mdat’) { bit(8) data[];
}
2.4 Movie Box --moov解析 (很复杂)
6096fb0: 9002 1900 2380 000c ca81 6d6f 6f76 0000 ....#.....moov..
6096fc0: 006c 6d76 6864 0000 0000 7c25 b080 7c25 .lmvhd....|%..|%
6096fd0: b080 0000 03e8 0014 6995 0001 0000 0100 ........i.......
6096fe0: 0000 0000 0000 0000 0000 0001 0000 0000 ................
6096ff0: 0000 0000 0000 0000 0000 0001 0000 0000 ................
6097000: 0000 0000 0000 0000 0000 4000 0000 0000 ...............
6097010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
6097020: 0000 0000 0000 0000 0003 0005 bf9d 7472 ..............tr
6097030: 616b 0000 005c 746b 6864 0000 000f 7c25 ak...\tkhd....|%
6097040: b080 7c25 b080 0000 0001 0000 0000 0014 ..|%............
6097050: 6595 0000 0000 0000 0000 0000 0000 0000 e...............
6097060: 0000 0001 0000 0000 0000 0000 0000 0000 ................
6097070: 0000 0001 0000 0000 0000 0000 0000 0000 ................
6097080: 0000 4000 0000 01d6 0000 0160 0000 0000 ..............
6097090: 0024 6564 7473 0000 001c 656c 7374 0000 .$edts....elst..
60970a0: 0000 0000 0001 0014 6595 0000 03e9 0001 ........e.......
60970b0: 0000 0005 bf15 6d64 6961 0000 0020 6d64 ......mdia... md
000c ca81 6d6f 6f76 -- moov的长度是0x0cca81, typemoov 0000 006c 6d76 6864 -- mvhd的长度是0x6c ,typemvhd 0000 0000 -- version0x0 7c25 b080 7c25 b080 -- create_timemodify_time0x7c25b080 0000 03e8 -- timescale0x3e81000 0014 6995 -- duration0x146995(单位是time_units) 0001 0000 -- rate0x00010000 0100 -- volume0x0100 0005 bf9d 7472 616b -- track的长度是0x5bf9d,typetrak 0000 005c 746b 6864 -- tkhd的长度是0x5c, typetkhd 0000 --version 000F -- flag 7c25 b080 7c25 b080 --create_timemodify_time0x7c25b080 0000 0001 -- trackID1 0000 0000 -- reserve 0014 6595 -- duration0x146595 0000 0000 -- reserved 0000 0000 -- reserved 0000 0000 -- layergroup 0000 0000 -- volumresever 0001 0000 0000 0000 0000 0000 matrix 0000 0000 0001 0000 0000 0000 0000 0000 0000 0000 4000 0000 01d6 0000 0160 0000 -- width0x1d6 height0x160(这儿都需要向右移16位) 0000 0024 6564 7473 --edts的长度是0x24,typeedts 注意: a.媒体文件在播放过程中用的时间单位是由timescale计算出来的 一个time units1s/timescale1ms这儿1 time_unts1ms b.通过duration可计算媒体的播放时间 0x146995*1ms1337749ms1337.749s对上了 附1.mvhd
ISO14496-12 的8.3.2 Syntax
aligned(8) class MovieHeaderBox extends FullBox(‘mvhd’, version, 0) {
if (version1) { unsigned int(64) creation_time; unsigned int(64) modification_time; unsigned int(32) timescale; unsigned int(64) duration;
} else { // version0 unsigned int(32) creation_time; unsigned int(32) modification_time; unsigned int(32) timescale; unsigned int(32) duration;
}
template int(32) rate 0x00010000; // typically 1.0
template int(16) volume 0x0100; // typically, full volume
const bit(16) reserved 0;
const unsigned int(32)[2] reserved 0;
template int(32)[9] matrix { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 };
// Unity matrix
bit(32)[6] pre_defined 0;
unsigned int(32) next_track_ID;
}
附2.trak 8.5.2 Syntax aligned(8) class TrackHeaderBox
extends FullBox(‘tkhd’, version, flags){ if (version1) { unsigned int(64) creation_time; unsigned int(64) modification_time; unsigned int(32) track_ID; const unsigned int(32) reserved 0; unsigned int(64) duration; } else { // version0 unsigned int(32) creation_time; unsigned int(32) modification_time; unsigned int(32) track_ID; const unsigned int(32) reserved 0; unsigned int(32) duration; } const unsigned int(32)[2] reserved 0; template int(16) layer 0; template int(16) alternate_group 0; template int(16) volume {if track_is_audio 0x0100 else 0}; const unsigned int(16) reserved 0; template int(32)[9] matrix { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 }; // unity matrix unsigned int(32) width; unsigned int(32) height;
}三.ffmpeg中对mp4的处理 3.1 对mp4文件的probe -- 在libavformat/mov.c中 有两个宏需要关注一下:
#define MKTAG(a,b,c,d) ((a) | ((b) 8) | ((c) 16) | ((unsigned)(d) 24))# define AV_RL32(x) \(((uint32_t)((const uint8_t*)(x))[3] 24) | \(((const uint8_t*)(x))[2] 16) | \(((const uint8_t*)(x))[1] 8) | \((const uint8_t*)(x))[0])
这两个宏都是把4个char组成一个int
3.2 mov_probe
static int mov_probe(AVProbeData *p)
{int64_t offset;uint32_t tag;int score 0;int moov_offset -1;dbmsg();/* check file header */offset 0;for (;;) {tag AV_RL32(p-buf offset 4); //将p-buf4即‘f’ ‘t’ y p组成一个intswitch(tag) { //判断这个int是不是ftypcase MKTAG(f,t,y,p):score AVPROBE_SCORE_MAX; //如果是的话score100,说明就是mov格式的文件break;}}return score;
}
精简一下mov_probe其实就是判断第一个box是不是ftyp,若是则就是mov格式的了。 3.3.1 对ftype的读取
static int mov_read_ftyp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{//读4个字节的major_brand,并存到dict中ffio_read_size(pb, type, 4);av_dict_set(c-fc-metadata, major_brand, type, 0);//读4个字节的minor_ver,并存到dict中minor_ver avio_rb32(pb);av_dict_set_int(c-fc-metadata, minor_version, minor_ver, 0);//读剩余的字节即comp_brands_str,并存到dict中comp_brand_size atom.size - 8; //atom.size己经是去除8字节头余下的sizeffio_read_size(pb, comp_brands_str, comp_brand_size);comp_brands_str[comp_brand_size] 0;av_dict_set(c-fc-metadata, compatible_brands, comp_brands_str, 0);return 0;
}
3.3.2 对free的读取
static int mov_read_free(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{//没什么作用只是读取出来把文件指针指向下一下box而己avio_read(pb, content, FFMIN(sizeof(content), atom.size));return 0;
}
3.3.3对mdat的读取
static int mov_read_mdat(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{//mdat更简单只把标志设置了一下c-found_mdat1;return 0; /* now go for moov */
}
3.3.4对moov的读取 三.附录: ISO/IEC 14496 MPEG的协议标准 转自: http://blog.csdn.net/yu_yuan_1314/article/details/9406587 ISO/IEC 14496是MPEG专家组制定的MPEG-4标准于1998年10月公布第1版1999年1月成为国际标准1999年12月公布了第2版2000年初成为国际标准。全文分为27个部分1ISO/IEC 14496-1系统部分描述视频和音频数据流的控制、同步以及混合方式即混流 Multiplexing简写为MUX。2ISO/IEC 14496-2视频部分定义了一个对各种视觉信息包括自然视频、静止纹理、计算机合成图形等等的编解码器。例如XviD编码就属于MPEG-4 Part 2。3ISO/IEC 14496-3音频部分定义了一个对各种音频信号进行编码的编解码器的集合。包括高级音频编码Advanced Audio Coding缩写为AAC的若干变形和其他一些音频/语音编码工具。4ISO/IEC 14496-4一致性部分定义了比特流和设备的一致性条件用来测试MPEG-4的实现。5ISO/IEC 14496-5参考软件提供了用于演示功能和说明本标准其他部分功能的软件。6ISO/IEC 14496-6多媒体传送整体框架DMIF这是MPEG-4应用层与传输网络的接口定义了通信协议使MPEG-4系统的数据流能进入各种传输网络。还包含一个存储格式MP4用于存储编码的场景。7) ISO/IEC 14496-7优化的参考软件提供了对实现进行优化的例子(这里的实现指的是第五部分)。8ISO/IEC 14496-8在IP网络上传输定义了在IP网络上传输MPEG-4内容的方式。9ISO/IEC 14496-9参考硬件描述提供了用于演示怎样在硬件上实现本标准其他部分功能的硬件设计方案10ISO/IEC 14496-10高级视频编码AVC定义了一个视频编解码器codec。AVC和XviD都属于MPEG-4编码但由于AVC属于MPEG-4 Part 10在技术特性上比属于MPEG-4 Part2的XviD要先进。另外它和ITU-T H.264标准是一致的故又称为H.264。11ISO/IEC 14496-11场景描述和应用引擎。12ISO/IEC 14496-12ISO媒体文件格式定义了一个存储媒体内容的文件格式。13ISO/IEC 14496-13知识产权管理和保护IPMPIntellectual Property Management and Protection扩展。14ISO/IEC 14496-14MP4文件格式定义了基于第十二部分的用于存储MPEG-4内容的容器文件格式。15ISO/IEC 14496-15AVC文件格式定义了基于第十二部分的用于存储第十部分的视频内容的文件格式。16ISO/IEC 14496-16动画框架扩展AFXAnimation Framework eXtension。17ISO/IEC 14496-17同步文本字幕格式。18ISO/IEC 14496-18字体压缩和流式传输(针对公开字体格式)。19ISO/IEC 14496-19合成材质流Synthesized Texture Stream。20ISO/IEC 14496-20简单场景表示LASeR for Lightweight Scene Representation。21ISO/IEC 14496-21用于描绘(Rendering)的MPEG-J拓展。22ISO/IEC 14496-22开放字体格式Open Font Format。23ISO/IEC 14496-2符号化音乐表示Symbolic Music Representation。24ISO/IEC 14496-24音频与系统交互作用Audio and systems interaction。25ISO/IEC 14496-253D图形压缩模型3D Graphics Compression Model。26ISO/IEC 14496-26音频一致性检查定义了测试音频数据与ISO/IEC 14496-3是否一致的方法Audio conformance。27ISO/IEC 14496-273D图形一致性检查定义了测试3D图形数据与ISO/IEC 14496-11:2005, ISO/IEC 14496-16:2006, ISO/IEC 14496-21:2006, 和 ISO/IEC 14496-25:2009是否一致的方法3D Graphics conformance。