现在的位置: 首页 > 移动开发> 正文
FLV格式流媒体的缓存渐进拖放原理
2012年06月02日 移动开发 评论数 2 ⁄ 被围观 6,300+

前几天讲解了mp4格式文件的解析,边缓存边播放,拖动处理,faplayer的编译等等,可以查看我的《Android系列专题文章》,本文给大家介绍flv格式文件的缓存渐进拖放原理。

flv是Adobe公司提出来的一种视频存储格式,因为其压缩的效果比较好,容量小,所以很适合网络传播,这也就是国外的youtube,国内的优酷,土豆等等都无一类外的采用flv格式来进行存储,有关flv格式的具体内容可以参照Flash Videoosflash

flv是采用一种tag的数据结构进行流媒体数据的存储,首先是文件头,接下来是可选的meta信息,再后面就是音频和视频数据的交替存储,比起来mp4文件庞大的文件头,flv的文件头基本可以忽略了,只有9个字节,meta部分存储一些音视频解码和长度等的一些信息,具体的音频和视频的tab部分存储实际的流媒体数据。

mp4文件之所以能边缓存边播放,并且可以支持跳转,原因是文件头存储了视频整体的信息,像视频的总时长,关键帧,对应的时间轴,对应的文件偏移量等等,有了这些信息,就能实现在视频全部下载完毕之前就支持跳转播放,如果mp4的文件头放在了文件末端,那么该文件就不支持缓存跳转播放了,只有等待文件全部下载完毕之后才能进行播放,具体怎么样将文件头重新提取到头部,我博客专题的文章中有写,可以参照。

同理,flv文件的meta信息是可选的,如果这部分数据没有存储关键帧,时间轴和文件偏移量,那么该flv文件在全部缓存完毕之前是不支持跳转播放的,那么,大家可能会很奇怪,优酷,土豆看了这么久,所有的视频都是可以拖动跳转的,那么具体的原因是什么,下面我给大家详细解释。

首先大家先了解下什么是flv meta 注入,意思就是通过解析当前flv文件的音视频tag,然后根据这些流媒体数据来生成关键帧,时间轴和偏移量的信息,然后将这些信息重置到该flv文件的meta部分,这样就能够使不支持拖动播放的flv文件变得支持拖动播放了,实际上优酷的做法就是这样,用户上传的视频动态转码成flv格式,并且通过扫描和解析flv文件,进行meta注入,最后我们在网上播放的视频就是处理过的视频。实现flv注入,有两个工具可以使用,具体可以参照flvmdiFLVTool2

接下来我用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部分的完善。

目前有 2 条留言 其中:访客:1 条, 博主:1 条

  1. accordall : 2012年08月23日17:05:20  -49楼 @回复 回复

    请问这种软解的方式对处理大尺寸的flv流视频流畅吗?是否有代码参考?谢谢! :sad:

    • 润物无声 : 2012年08月28日09:24:43 @回复 回复

      一般的视频流数据够用了,大约时长在30分钟附近,再大一些的数据估计也行,不会有大的效率损失,代码的话,我也是只能在网上寻找开源的视频解析包,找自己对应的开发语言的即可,然后主要是自己熟悉一下视频的格式,解析的话自己也就能做了。

给我留言

留言无头像?


×
腾讯微博