MP4共享FLV数据研究与实现
2014-11-10李兴华杨天奇
李兴华,杨天奇
(暨南大学 计算机应用技术系,广东 广州 510632)
进入Web 2.0时代后,国外的Youtube,国内的优酷、土豆网等视频分享网站快速发展,FLV因为占用的存储空间小、加载速度快,已经成为各主流视频网站存储视频的主要格式。随着移动互联网的发展,越来越多的人喜欢在移动设备上观看在线视频,而MP4格式[1]则是IOS、Android等主流移动智能操作系统原生支持的视频格式。将FLV视频转化为MP4视频,是视频网站为支持这些移动设备在线观看的传统方法。这种方法的缺点是对于每个FLV视频需要转化出一个大小相当的MP4文件,占用服务器巨大的存储空间[2-3],同时需要耗费较多的转化时间。现在越来越多的公司采用HTTP Live Streaming(HLS)[4]将流媒体切分为若干 Transport Stream(TS)片段,然后通过一个扩展的m3u8播放列表文件将这些TS片段集中起来供客户端播放器接收。其优点是用户切换进度更快,临时文件小;缺点是生成和分发比较复杂,生成高清视频TS片段时服务器负载较高。MP4格式共享FLV格式数据的优势是它能以极小存储空间高效方便地满足主流移动平台的在线视频播放。
1 相关技术
1.1 FLV视频格式简介
Flash Video(FLV)[5]流媒体格式是随着 Flash MX 的推出而发展而来的视频格式。FLV文件占用的存储空间非常小。FLV还有解码效率高和视频清晰等优点。因此,主要的在线视频网站均使用FLV格式文件存储视频,为用户提供优质的在线视频服务。
FLV是一种全新的流媒体视频格式,它利用了网页中广泛使用的Flash Player平台,将FLV视频整合到Flash动画中。只要访问者能够正常观看Flash动画,就能观看FLV格式视频,而无需再额外安装其他视频插件。因此,FLV格式的使用给视频的传播带来了极大便利。
FLV是一个二进制文件,文件符合流式传输的特点,由文件头(FLV Header)和文件体(FLV Body)组成。FLV文件结构图如图1所示。文件头定义了Flash文档的版本、是否压缩、文件大小、场景大小、帧率和总帧数[6]。文件体由大量的标签(Tag)组成,文件体的最后是一个结束标签。Tag又可以分成Audio和Video和Script 3类,分别代表音频流、视频流和脚本流。每一个Tag都包括一个标签头(Header)和一个数据体(Body)。
图1 FLV文件结构图
通过分析Tag的Header部分,可以立刻知道这个Tag的类型代码和长度,标签结构如表1所示。
表1 标签结构
通过解析FLV格式而得到的Tag内容里的音视频数据就是MP4文件格式所需要共享的FLV文件格式的内容。
由于主流移动平台对Flash Player支持不够,存储为FLV格式的视频不能有效满足移动平台观看,而MP4格式却是可以得到广泛支持的视频格式,因此将这些FLV视频转化成MP4格式是视频网站的传统做法。
1.2 MP4视频格式简介
MP4[7],全称 MPEG-4 Part 14[8],是一种使用 MPEG-4的多媒体电脑档案格式,后缀名为.mp4。
MP4视频文件封装格式是基于QuickTime[8]容器格式定义的。MP4文件格式是一个十分开放的容器,几乎可以用来描述所有的媒体结构,MP4文件中的媒体描述与媒体数据是分开的,并且媒体数据的组织也很自由,不一定要按照时间顺序排列。
MP4文件格式是以面向对象的架构来描述文件的,对象被称为box。MP4文件中的所有数据都装在box中,也就是说,MP4文件由若干个box组成。每个box的结构都由大小、类型和内容组成。一个box还可以包含别的box,这种分层结构以及box的自身结构使得box的插入和删除十分方便。
同时,MP4也支持流媒体[9]。MP4目前被广泛用于封装 H.264[10]视频和 Advanced Audio Coding(AAC)音频,是高清视频的代表。
通过对FLV和MP4的介绍可知,如果能将FLV转化MP4的传统方法加以创新,使MP4共享FLV数据,不仅能在存储空间上大大节省成本,计算效率也能大幅度提高,具有很高的研究价值和现实意义。
2 MP4文件共享FLV文件媒体数据
2.1 MP4格式特点
MP4由一系列的box组成,box是一种独特类型的由识别符和长度构成的面向对象的建筑块,也称为atom。表2列出了常见的box类型。
表2 常见box类型
通常来说,一个MP4文件主要包含两个atom,分别是存储元数据的 Movie atom(moov)和存储媒体数据的Media Data atom(mdat)[11-14]。
一个 MP4文件由一个ftyp类型的 box开始,ftyp包含关于文件的一些信息。ftyp之后有且只有一个moov类型的 box,它是一种容器 box,子 box包含了媒体的元数据信息。MP4文件的媒体数据包含在mdat类型的box中,该类型的box也是容器box,可以有多个子box。图2展示了MP4文件的结构树。
moov包含了文件媒体的所有元数据信息,moov容器box通常在靠近该文件的开头或结尾地方。
trak是一个 container box,其子box包含了该轨道的媒体数据引用和描述。一个MP4文件中的媒体可以包含多个track,并且至少有一个轨道,这些轨道之间彼此独立,有各自的时间和空间信息。
mdia容器的轨道媒体信息定义了轨道媒体类型。
minf容器包含了所有关于轨道媒体中定义特征信息的对象。
stbl样品表box包含了轨道里所有媒体样本的时间和数据索引信息。通过样本表,可以定位样本的时间,确定它们的类型(例如I-帧),并确定它们的大小以及文件中的偏移量。
图2 MP4文件结构树
stsc提供样本块的部分数据的偏移信息表。媒体数据里的样本被分组为块。块可以是不同的大小,块内的样本可以具有不同的尺寸。这个表可以用于找到块的位置以及相关的样本描述。偏移信息表是紧凑的编码。每个条目给出运行块的第一个块的索引。
stsz包含样本数和一张描述各个样本大小 (以字节为单位)的表。
stso、co64对象包含一张块的偏移表,表里给出了文件中每个块的索引,允许使用32位或64位偏移,64位偏移在文件超过4 GB时使用。
2.2 MP4文件共享FLV文件数据
MP4文件中的媒体描述与媒体数据是分开的[6],MP4的媒体数据的组织也很自由,可以不用按照时间顺序排列。MP4文件共享FLV文件媒体数据关键就在于生成一个共享FLV媒体数据的MP4文件头部,称为共享MP4头部。
共享MP4头部在媒体描述中的stco box记录每个媒体数据数据块在完整MP4文件中位置,完整MP4文件由共享MP4头部和对应的FLV文件组成。即在原有FLV文件的基础上,再增加一个只有FLV文件1%左右大小的共享MP4头部,就可以共享FLV文件的视频内容。
对于在线视频网站,可以不用在视频服务器里为每个FLV视频转化一个完整的MP4视频,视频网站可以通过生成共享MP4头部共享FLV视频数据,节省巨大的存储空间。
对于一个已经存在FLV文件格式的视频,只需要用共享工具生成对应的共享MP4头部,就可以同时满足对这个视频的FLV和MP4两种格式的访问需求。
当用户通过移动设备观看某个视频时,视频网络的服务器只需要顺序返回这个视频的共享MP4头部和FLV视频文件即可。
MP4文件共享FLV文件数据方案以极小的存储代价和计算代价,满足了移动设备观看已经存在的海量FLV视频文件的需求。
2.3 基于FFMPEG库的共享工具简介
MP4文件共享FLV文件数据的共享工具主要是在开源项目FFMPEG的基础上实现的。
FFMPEG是一个非常优秀的开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据所选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。
FFMPEG是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec等。
共享工具主要使用了FFMPEG库里的libavformat、libavcodec和ffmpeg项目。libavformat用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;libavcodec用于各种类型声音/图像编解码;ffmpeg项目提供的一个工具可用于格式转换、解码等。
2.4 共享工具生成共享MP4文件
共享工具生成共享MP4文件,首先需要将FLV文件解封装提取出FLV文件中的视频信息,然后将这些视频描述信息写入共享MP4文件中。
在FLV文件中解析出的每个标签里,数据区的内容是需要共享的内容,也是FLV文件里的最主要组成部分。将FLV文件中每个标签的数据区在FLV文件中的偏移值记录在共享MP4文件的stco对象中,将FLV的每个标签的数据区长度记录在共享MP4文件的stsz对象中。
共享MP4文件的mdat对象的大小就是FLV文件的大小,mdat对象的内容则不需要写入共享MP4文件,因为 mdat对象内容正是对应的整个FLV文件。共享MP4文件和对应的FLV文件可以组成一个完整的MP4文件。
共享工具需要生成的共享MP4文件是一个除去mdat对象内容的MP4文件。在初始生成共享MP4文件过程中,需要在共享MP4文件的stco对象中记录对应FLV中每个音视频标签的内容数据在FLV文件的位置,即共享MP4文件stco对象存储着FLV文件中标签的内容的偏移值,如图3所示。
2.5 修正共享MP4文件
共享工具初始生成的共享MP4文件中的stco对象记录的偏移值是在FLV文件中的偏移值,不是共享MP4文件和FLV文件组合成的完整MP4文件中的偏移值,因此需要修正共享MP4文件的stco对象中记录的原始偏移值。需要将共享MP4文件的stco对象中的原始偏移值加上共享MP4文件的大小,如图4所示,这样得出的位置值才是共享MP4文件和对应FLV文件组合成的完整MP4文件里的真实偏移值。
图3 初始成共享MP4文件
图4 修正共享MP4文件
本文主要研究了一种传统流媒体文件FLV在适应移动设备上播放的一种高效、节约成本的可行性方案。MP4共享FLV数据利用MP4和FLV两种格式的特点达到数据共享的目的,从而满足了移动设备在线观看的需求。
相对于直接转换MP4文件的方式,MP4文件共享FLV文件数据方案节约了近一半的存储空间,并且对于计算的消耗极小。对于拥有上千万部FLV视频内容的视频网站,利用共享数据方案可节省上千万元的存储成本,且维护起来非常方便、可靠。相对于TS流方案,MP4文件共享FLV文件数据方案对源服务器的负载压力小很多,且生成、分发以及维护也简单很多。
由于MP4文件播放前需要加载完整个头部才能播放,因此对于低质量的长视频文件,利用HLS协议提供服务体验会更好;对于高清短视频,使用MP4文件共享FLV文件数据方案是最佳选择。
[1]SINGER D,BELKNAP W,FRANCESCHINI G.ISO media file formatspecification[R].ISO/IEC JTC1/SC29/WG11 MPEG01/N4270-1,2001.
[2]陈利,吕格莉,潘正清.流媒体视频存储服务器设计与研究[J].计算机工程与设计,2010,31(4):903-906
[3]谢建国,陈松乔.视频存储技术发展综述[J].计算机工程与应用,2002,38(9):17-19.
[4]维基百科.http://zh.wikipedia.org/wiki/HTTP_Live_Streaming,2013-03-14.
[5]Adobe Macromedia video file format specification version10.http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf,2013-04.
[6]王奎澎,刘建辉.Flv文件格式及其嵌入式应用[J].计算机系统应用,2010,19(3):190-191.
[7]ISO/IEC 14496-14, information technology-coding of audio-visual objects-part 14: MP4 file format[S].
[8]ISO/IEC 14496-10, information technology-coding of audio-visual objects-part 10:Advanced video coding[S].
[9]Apple.QuickTime file format specification[S].
[10]THOMAS W,GARY S,GISLE B,et al.Overview of the H.264 PAVC video coding standard[J].IEEE Transactions on Circuits and Systems for Video Technology, 2003(7):560-576.
[11]ISMA.Internet streaming media alliance implementation specification(Version 2.0)[M].
[12]周瑾,支琤,宋利.流媒体应用 TS和 MP4格式分析[J].信息技术,2007(7):16-18.
[13]赵丽娜,韩冬梅,薛华成.一种有效加密 MP4文件的方法[J].计算机应用与软件,2010,10(10):22-23.
[14]郑翔,周秉峰,叶志远,等.流文件 MP4文件的核心技术[J].计算机应用,2004(5):76-78.