FLV格式是在Flash Player 6中引入的,当时更多的是被存放在SWF文件的内部,不过后来因为体积越来越大而直接独立了出来,它的结构相对而言比较简单,主要分为两块,位于文件头部的元数据信息和后面的音视频数据。不过在数据的存放上面,FLV是将数据分为多个标签进行存储的,每个标签都带有自己的时间戳,所以这就保证了流传输时的音画同步。
由于FLV结构简单但是功能足够用,并且被Flash Player天然支持,所以在当时的视频网站上面普遍都使用它作为容器,直到今天还有很多网站没有放弃它,虽然其中的视频编码早已升级,它也有衍生出来的F4V作为后继者,虽然后者的血统已经不是Flash家族的了。
F4V:换了血的继任者
小编还记得土豆网在2009、2010年左右在国内率先开始使用H.264编码,当时如果将清晰度切换到“高清”就会播放这些用H.264编码的视频。而用飞速土豆加速会缓存到一些.f4v扩展名的文件,乍一看还以为它就是FLV,但其实不然,F4V其实是MP4所在的ISO标准容器家族的,但也是Adobe搞出来的FLV的后继者。关于后者的详情,请往下看。
MOV:苹果向业界作出的贡献MOV格式的正式名字叫QuickTime File Format。看到这个QuickTime第一反应肯定是“哦,这是苹果的东西”。确实,QuickTime File Format是由苹果在1998年推出的,它引入了原子(atom)的概念,在QTFF格式中,atom是基本的数据单元,它可以用来容纳实际的音视频数据,也可以放置元数据和字幕等文本信息,atom中所容纳的数据类型和大小在每个atom的头部进行描述,经过一层层的嵌套之后,整个数据文件呈现了一种树状的结构,并且保留了强大的可扩展性。
MOV和MP4这些ISO标准容器格式的开头都有一个ftyp用于标记格式
MOV作为苹果QuickTime编码的成员,在目前仍然被苹果设备广泛使用着,并且对于它的支持非常好。1998年推出QTFF的同时,苹果将这个格式交给了ISO组织,后者将它标准化为国际通用容器格式,而基于这个标准衍生出来的容器,又可以叫做ISO/IEC base media file format,同时被MPEG组织采纳,写入MPEG-4 Part 12标准中。
ISO标准容器格式
ISO标准容器格式是一个规范,它代表符合这个规范的容器类型,而不是特指某个格式。它是由苹果的QuickTime File Format发展而来的,在MPEG-4 Part 12中被最终确定并被ISO/IEC组织写入标准。它虽然没有具体实现,但是它定义了基于时间码的多媒体文件的通用结构,并由此成为了MP4、3GP等格式的基础。
3GP、MP4与ISO标准容器格式的关系
MP4:标准,泛用MP4肯定是现在最通用最流行的媒体容器,甚至可以说没有之一。但其实现在的MP4和早期的并不是同一个标准,目前常见的MP4标准是在2003年完整的的MPEG-4 Part 14规范中制定的,到今天为止也经过了多次的修订。它其实与MOV之间并没有太大的区别,基本上就是把MOV的atom改了个名字,叫成box,然后加了一点别的佐料。
MP4的内部结构
苹果建立iTunes Store卖数字音乐的时候选择了AAC-LC作为他们的音频编码格式,而容器格式上面他们并没有选择与AAC-LC处于同一时代(MPEG-2)的ADTS,而是选择了比AAC-LC大一辈的MPEG-4标准容器,也就是MP4,不过因为它只含音频所以我们看到的扩展名就是.m4a,iTunes Store还卖一种只有视频没有音频的MV,它用的也是MP4,扩展名为.m4v,本质上它们就是同一种东西。
目前很多视频网站已经从FLV切换到MP4上面了,而且还有一种新的MPEG-DASH格式就是借助于MP4可分割的特性实现的,它将一整段视频切成许多段小块,方便浏览器进行加载,减少HTTP长连接对服务器的压力。
这里说一句题外话,当年某站刚上HTML5播放器的时候,因为他们原来的视频几乎全部都用的是FLV存储的,而HTML5标准并不支持它,所以要进行一个容器转换,某站当时一位非常年轻的程序员写出了一个在浏览器内实时将FLV文件转成MP4并喂给浏览器的媒体播放器的脚本,名为flv.js,这个脚本可能给某站省下了非常大的格式转换成本。不久之后这位程序员因为受不了某站的低薪而离职。这件事曾经引起了很多社区的热烈讨论,因为今天是程序员日所以特地写了这么一段。
3GP:精简小巧,手机最爱
3GP是MP4的同族兄弟,一样是基于ISO标准容器格式,用过3GP的兄弟肯定还记得这格式最多出现的地方是哪里——以诺基亚为代表的前智能手机时代,手机录像出来的文件大多都是3GP格式的。
3GP这个容器格式标准其实不是由以往的MPEG啊这类专注于多媒体编码的组织搞出来的,而是3GPP,对没错就是制定通信行业标准的那个组织制定的。它在容器支持的格式上进行了精简,只面向于手机可以进行的编码,比如MPEG-4 Visual、H.263这些比较老的视频编码和AMR、AAC这两种前智能手机时代使用较多的音频编码。
因为前智能手机时代的手机性能并不强大,一般也不需要支持很多种格式,不用像MP4那么全面,所以3GP最终成为了一种被广泛支持的格式,不过也因为它支持的格式过于有限,最终在智能手机时代被同门大哥MP4给取代了。
MPEG-DASH
面对时下流行的流媒体,MPEG组织对MP4文件进行了魔改,由于MP4天生可以进行无损切割的特性,DASH方式将原本媒体文件中完整的文件头的元数据信息和片段Box中的信息抽取出来单独写在一个文件(MPD)中,同时还包含了片段的URL等信息,播放器可以自适应选择需要的片段进行播放,在自适应程度上面比HLS更强一些。(其实MPEG-DASH也可以用TS作为容器,但用MP4更多一些)