本文摘自PHP中文网,作者阿神,侵删。
首先声明,我不太懂JavaScript,我只是熟悉音视频处理部分,有错误在所难免,欢迎指正。flv.js项目的代码有一定规模,如果要研究的话,我建议从demux入手,理解了demux就掌握了媒体数据处理的关键步骤,前面的媒体数据下载和后面的媒体数据播放就变得容易理解了。
先普及点背景知识,为什么HTML5视频播放要用 flv 格式?
因为Flash。我标题图片用的是“flash RIP”,flash快死了,但是它的影响力还在,flash技术是过去10多年的互联网视频基础技术,大量相关基础设施都是围绕Flash构建的,比如 CDN 普遍支持的 RTMP 和 flv over http协议。做互联网直播的公司为了能兼容Web上的Flash播放,不约而同地选择了flv的媒体格式。在从Flash到 HTML5过渡的时期,如果HTML5能支持flash的协议是再好不过了,可以平滑过渡,然而HTML5并不原生支持flash协议。flv.js这个项目解决了HTML5支持flash协议的问题,这就是flv.js应运而生短期爆红的历史背景。
flv.js 中的demux就是一套 FLV 媒体数据格式的解析器,如果要理解FLV格式,下面的文档是必须熟读的。
Adobe官方的flv格式说明
http://www.adobe.com/content/dam/Adobe/en/devnet/flv/pdfs/video_file_format_spec_v10.pdf
flv.js怎么用? 下面进入正题,flv.js代码解读:demux部分
打开代码 https://github.com/Bilibili/flv.js/blob/master/src/demux/flv-demuxer.js
1 2 3 4 5 6 7 |
|
0x46 0x4c 0x56 这几个数字其实就是 'F' 'L' 'V' 的ascii码,表示flv文件头,后面的0x01是flv格式的版本号,用这来检测数据是不是 flv 格式。
1 2 |
|
取出第五个字节,它的第六 和 第八 bit 分别表示是否存在 音频和视频数据,其它位是保留位可以忽略。
这个probe是被 parseChunks 调用的,当读取了至少13个字节后,就判断下是否是一个flv数据,然后再继续后面的分析。为什么是13,因为flv的文件头就是13个字节,参考 上面 PDF里的 “The FLV header”,这13个字节包括了后面的一个四字节的size,这个size表示前一个tag的大小,但是由于第一个tag是不存在前一个的,所以第一个size总是 0。
parseChunks 后面的代码就是在不断解析 tag,flv把一段媒体数据称为 TAG,每个tag有不同的type,实际上真正用到的只有三种type,8、9、18 分别对应,音频、视频和Script Data。
1 2 3 4 5 6 |
|
这段代码就在判断tag type,注意看 那个 数字 11,因为tag header是11个字节,后面就是tag body了,所以offset加上这些偏移是为了跳到下一个tag的位置。
tag header的格式为:UI 表示 unsigned int,后面的是bit数。
UI8 tag type
UI24 data size
UI24 timestamp
UI8 TimestampExtended
UI24 StreamID
相关阅读 >>
更多相关阅读请进入《解读》频道 >>

Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者