一种快速将FLV 文件转换为MP4文件的方法和实现

2021-07-16 06:13叶远清
网络安全技术与应用 2021年7期
关键词:视频文件浏览器头部

◆叶远清

(广州市第十二人民医院 广东 510620)

Flash 曾经为互联网富媒体领域的主流解决方案,但由于其安全性不断受到诟病,且随着HTML5、WebGL 等技术的不断成熟,现代浏览器已有足够高的性能和安全的解决方案替代Flash 技术。Adobe公司宣布于2020 年12 月31 日结束对FlashPlayer 的分发和更新,并建议用户卸载Flash Player;主流的浏览器如IE/Edge/Chrome/Firefox等也于该日期后无法使用Flash 技术。而在过去的20 多年,由于Flash技术的流行,以及视频网站的蓬勃发展,在浏览器的HTML 5 技术还未成熟之时,众多的公司和视频网站都是采用服务器后端存储FLV视频格式文件,前端浏览器使用Flash Player 播放视频的技术架构。在Flash 技术被结束生命周期后,导致网络上以及企业中已存的FLV格式视频无法在浏览器上正常播放。通常,传统的方案可以通过使用ffmpeg/mencode 等视频处理工具将FLV 格式视频转换成MP4 文件格式,但当有大量FLV 视频文件内容时,则需要大量的计算资源对FLV视频格式进行重新编码并使用MP4 文件格式重新封装。本文通过分析FLV 视频文件格式和MP4 视频文件格式的特点,研究出一种给原有FLV 视频文件添加一个合适的MP4 头部以实现网络播放的方案,作为传统方案的补充方案。

1 视频文件格式介绍

介绍本方案前,先简单介绍FLV 视频格式和MP4 格式的基本特点,为了方便述说本方案,以下对FLV 视频文件格式和MP4 视频文件格式的介绍都做了简化,突出本方案使用到的关键部分,其他无关部分则弱化处理。

1.1 FLV 文件格式

FLV 视频文件是Adobe 开发的视频文件格式,可以在网络上以流的形式播放。如图1 所示,FLV 文件主要分为FLV 头部和FLV 文件主体两大部分。FLV头部主要用来标识文件是否为FLV格式文件,以及是否包含视频流、音频流等情况。FLV 文件主体则包含了具体的视频流和音频流等媒体数据,这些媒体数据都封装在Tag 中,视频数据为Video Tag,音频数据为Audio Tag,Video Tag 和AudioTag 以间隔方式出现,一个Video Tag 衔接一个Audio Tag[1-2]。

图1 FLV 和MP4 的文件格式

Video Tag 中包含Tag Header、Tag Metadata 以及Video Data。Tag Header 标识本Tag 是视频,以及该视频数据所处的时间点等属性;Tag Metadata 则标识本 Tag 所包含的 Video Data 的帧类型(FrameType 如是key frame 还是inter frame),视频编码类型(CodecID,如7 表示AVC 编码)等解码该视频数据所必须的信息;Video Data 则是包含的具体视频数据。

Audio Tag 也类似,包含Tag Header、Tag Metadata 以及 Audio Data。Tag Header 标识本Tag 是音频,以及该音频数据所处的时间点等属性;Tag Metadata 则标识本Tag 所包含的Audio Data 的音频格式(SoundFormat,如10 表示AAC 编码)、音频采样率(SoundRate,如3 表示44kHZ)等;Audio Data 则是包含具体的音频数据。

1.2 MP4 文件格式

MP4 文件格式与FLV 文件格式相差甚大,其不像FLV 文件那样,多媒体的Metadata 分布在Video Tag 和Audio Tag 中,而Video Tag和Audio Tag 间隔分布在整个文件中。如图1 所示,MP4 文件格式主要包含三个数据节点(通常叫box):ftype box:文件类型,描述MP4文件所遵从的规范版本;moov box:包含正确播放媒体数据所需的元数据(metadata);mdata box:存储具体的视频和音频等媒体数据(有时候还会有多条字幕数据)[3-4]。

moov box 内包含关键的Box 为Trak Box,可以是Video 类型,包含视频数据,可以是Audio 类型,包含音频数据;每个Trak Box内包含stbl box(sample table box):包含媒体样本(sample)的序号、时间、文件位置映射的信息。stbl box 包含三类关键的box:stsz(sample size box),记录每个sample 的字节大小;stsc(sample to chunk box),sample-chunk 的映射表,表示一个chunk 包含了哪些sample;stco(chunk offset box),每个chunk 在mp4 文件中的偏移量,这个偏移量通常是指向mdata 区的某个位置,如图2 所示,stco 中的偏移量索引了mdata 中的数据块,而stsz 中的数据块则表示了对应数据块的长度,结合stco 和stsz 就能读取到对应的chunk。当播放器播放视频时,即根据stco 的chunk offset 找到对应的数据块,根据stsz 和stsc 的信息读取相应的媒体sample 数据,并对这些数据进行解码播放。

图2 MP4 头部中stco 和mdata 的映射关系

一个MP4 文件包含若干个Trak,一个Trak 包含若干个chunk,一个chunk 包含若干个连续的sample,而sample 则是媒体数据的存储单位,其可以是video sample,也可以是audio sample,取决于Trak是Video Trak 还Audio Trak。

2 方案设计

方案的核心理念则是针对MP4 文件格式的特点,利用其媒体数据sample 文件都存储在mdata 段,而具体索引这些媒体sample 数据所需的地址集合、大小、chunk-sample 映射都包含在MP4 文件头部中的stco、stsz、stcs box 中的特点,考虑到FLV 文件的文件格式是一个video sample 和一个audio sample 间隔排列的特点,我们可以生成一种符合MP4 规范,但又比较特殊的MP4 文件头部,拼接在FLV文件的头部,形成一个MP4 文件。

MP4 文件中的video/audio sample 对应FLV 文件中的video/audio data,都是具体为某种编码的媒体数据。如图3 所示,FLV 文件的一个video/audio tag 数据块包含了tag header、metadata 以及video/audio data,由于tag data、metadata 的存在,在FLV 文件中,video/audio data是不连续的,导致生成的对应的MP4 文件头部中的stsc box 比较特殊,其中每项表示的每一个chunk 只包含一个sample;而stsz 中的每项则表示了该sample 的大小,stco 中每项表示的偏移量则指向每一个间隔分布在FLV 文件中的video/audio data。

图3 MP4 头部stsz/stco 和FLV 文件的映射关系

3 方案实现

具体实现时,对于MP4 文件格式的解析代码,可具体采用ffmpeg中对应的MP4 格式文件解封装代码,对于FLV 文件格式的解析代码,亦可具体采用ffmpeg 中对应的FLV 格式文件解封代码。通过扫描FLV 文件,记录每个video/audio data 块的位置和大小,按照MP4 的规范生成对应的MP4 头部,并将该MP4 头部拼接在FLV 文件的头部(类似Linux 命令:cat mp4_header file.flv >>file.mp4),生成的该文件是个标准的MP4 文件,可直接使用支持MP4 格式的播放器进行播放。

对于使用网络浏览器播放的情况,不需要真实地将该MP4 头部与FLV 文件进行拼接,可通过Webserver(如nginx)在输出文件时,先输出已生成的MP4 头部,再继续输出对应的FLV 文件的方式。从浏览器的角度,这就是从后端输出的一个完整的,符合MP4 规范的视频文件,可正常地通过video 标签进行引用,并且能正常地拖动播放,与普通的MP4 文件并无不同[5]。

4 结论

传统的处理方案是将FLV 文件重新编码和封装成MP4,因为视频的编解码本身就是对视频的有损压缩,需要大量的计算才能重新对视频进行编解码,对于大量的FLV 视频文件而言,这样的方案需要大量的计算资源,速度慢,需时长,且生成的新MP4 文件也与原FLV文件大小基本相同,导致占用的存储空间翻倍。而本文所提供的方案则不需要对原有的FLV 视频文件做重新编码,而是基于FLV 以及MP4 格式的封装特点,只需要扫描FLV 文件生成一个很小的MP4文件头部,直接索引FLV 文件中的媒体数据即可,不会占用大量的服务器计算资源,也不会占用大量的服务器存储空间,方便快捷。对于网络上存在的海量FLV 视频而言,有重大的现实意义。

猜你喜欢
视频文件浏览器头部
流媒体视频文件相似性识别的方法
随心定制视频文件的缩略图
火箭的头部为什么是圆钝形?
微软发布新Edge浏览器预览版下载换装Chrome内核
反浏览器指纹追踪
快速检索,抓取电影中的精彩篇章
自适应统计迭代重建算法在头部低剂量CT扫描中的应用
蚝壳巧制作
视频文件,看过来
浏览器