前几天讲解了mp4格式文件的解析,边缓存边播放,拖动处理,faplayer的编译等等,可以查看我的《Android系列专题文章》,本文给大家介绍flv格式文件的缓存渐进拖放原理。
flv是Adobe公司提出来的一种视频存储格式,因为其压缩的效果比较好,容量小,所以很适合网络传播,这也就是国外的youtube,国内的优酷,土豆等等都无一类外的采用flv格式来进行存储,有关flv格式的具体内容可以参照Flash Video和 osflash。
flv是采用一种tag的数据结构进行流媒体数据的存储,首先是文件头,接下来是可选的meta信息,再后面就是音频和视频数据的交替存储,比起来mp4文件庞大的文件头,flv的文件头基本可以忽略了,只有9个字节,meta部分存储一些音视频解码和长度等的一些信息,具体的音频和视频的tab部分存储实际的流媒体数据。
mp4文件之所以能边缓存边播放,并且可以支持跳转,原因是文件头存储了视频整体的信息,像视频的总时长,关键帧,对应的时间轴,对应的文件偏移量等等,有了这些信息,就能实现在视频全部下载完毕之前就支持跳转播放,如果mp4的文件头放在了文件末端,那么该文件就不支持缓存跳转播放了,只有等待文件全部下载完毕之后才能进行播放,具体怎么样将文件头重新提取到头部,我博客专题的文章中有写,可以参照。
同理,flv文件的meta信息是可选的,如果这部分数据没有存储关键帧,时间轴和文件偏移量,那么该flv文件在全部缓存完毕之前是不支持跳转播放的,那么,大家可能会很奇怪,优酷,土豆看了这么久,所有的视频都是可以拖动跳转的,那么具体的原因是什么,下面我给大家详细解释。
首先大家先了解下什么是flv meta 注入,意思就是通过解析当前flv文件的音视频tag,然后根据这些流媒体数据来生成关键帧,时间轴和偏移量的信息,然后将这些信息重置到该flv文件的meta部分,这样就能够使不支持拖动播放的flv文件变得支持拖动播放了,实际上优酷的做法就是这样,用户上传的视频动态转码成flv格式,并且通过扫描和解析flv文件,进行meta注入,最后我们在网上播放的视频就是处理过的视频。实现flv注入,有两个工具可以使用,具体可以参照flvmdi和FLVTool2。
接下来我用win版本的flvtool来分析一段优酷的视频(谢霆锋热血微电影),解析到的meta信息如下:
--- C:/Users/Administrator/Desktop/flvtool2.exe -P test.flv hasKeyframes: true hasVideo: true framerate: 15 audiosamplerate: 22050 hasAudio: true height: 288 metadatacreator: modified by youku.com in 20111202 keyframes: times: - 0 - 0 - 6 - 12 - 18 - 24 - 25.6666666666667 - 26.7333333333333 - 28.3333333333333 - 30.2666666666667 // 省略部分 - 193.866666666667 - 199.866666666667 - 205.866666666667 filepositions: - 1400 - 1494 - 98389 - 205673 - 312032 - 422862 - 438242 - 495063 - 555999 - 695882 // 省略部分 - 7259084 - 7426324 - 7538447 duration: 210.066666666667 hasMetadata: true width: 512 ...
通过分析上面的meta信息,我们可以得到该视频的播放尺寸为512*288,视频的总时长约为210s,也就是3分半钟,从keyframes中可以解析得到关键帧对应的时间轴和对应的文件文件偏移量,有了这些信息,就能让该视频支持缓存跳转播放了,还有一句话,大家注意“metadatacreator: modified by youku.com in 20111202”,这是优酷在进行视频处理的时候填入的制作者信息。
好了,原理的部分就讲到这里,至于代码的实现,可以先参照我系列文章中mp4播放器边缓存,边播放,拖动缓存的实现代码,后续再做flv部分的完善。
请问这种软解的方式对处理大尺寸的flv流视频流畅吗?是否有代码参考?谢谢! :sad:
一般的视频流数据够用了,大约时长在30分钟附近,再大一些的数据估计也行,不会有大的效率损失,代码的话,我也是只能在网上寻找开源的视频解析包,找自己对应的开发语言的即可,然后主要是自己熟悉一下视频的格式,解析的话自己也就能做了。