http://blog.csdn.net/felix__/archive/2009/04/26/4121644.aspx
先介绍下flv的格式:
flv文件是个二进制文件,由一个文件头(flv header)和许多个tag块(统一叫flv body)组成。
*********
1.文件头(flv header),通常是9个字节,主要就是用于表示文件是flv格式,没有什么有价值的信息。具体格式:
格式名称
文件类型
版本
流信息
header长度
扩展信息
*********
2.flv body。也就是flv的主体,这只是个概念,用来统称除掉flv header之外的部分,即一系列的tag。每个tag的格式都是固定,具体参考下面。
*********
3.tag。flv里面帧的实体就是tag了。每个tag都可以分为两部分,第一部分包含是tag 类型信息,长度固定为15字节;第二部分为tag data,也就是flv的数据(有音频,视频,脚本等三类数据),其长度由第一部分的特定位给出。具体格式及其含义如下:
上一个tag的长度
tag种类
data域长度
时间戳
时间戳扩展位
流ID
Data
到这里,flv的格式没有具体说明的就是tag中的data域,不过这个域的长度我们已经可以获得。切割时先拷贝flv header,然后一个一个地拷贝tag。计算好已经拷贝的总大小(或是时间长度),很容易就能按大小(或是时间长度)切割出文件来。当然,tag data域里有些信息我们可能是感兴趣的,比如一个视频的tag是不是关键帧。这就需要区解读data域。切割的时候,还要注意修改每帧的时间戳(每个文件的第一帧都应该从0开始)。flv文件的第一帧往往是被称为metadata 的脚本tag,在这个tag里有整个flv的时长(由一个duration的字符串跟着64位的dobule值,单位是秒),播放器会去读取这个数据,所以切割的时候也要保证这个数据的正确性。flv里的数据多数是按网络序存储在文件中的,读到本机处理前要逆序,处理后也要逆序再存回去。不做详细分析了,可以参考官方的文档《video_file_format_spec_v9》。 细心决定成败。
参考文献:(网页有可能过期)
http://noahgenius.javaeye.com/blog/164782
官方文档《video_file_format_spec_v9》