FLV科普1 简介

来源:互联网 发布:海岛奇兵多管升级数据 编辑:程序博客网 时间:2024/04/29 19:55

FLV 是FLASH VIDEO的简称,FLV流媒体格式是随着Flash MX的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等问题。

FLV是被众多新一代视频分享网站所采用,是目前增长最快、最为广泛的视频传播格式。是在sorenson公司的压缩算法的基础上开发出来的。FLV格式不仅可以轻松的导入Flash中,速度极快,并且能起到保护版权的作用,并且可以不通过本地的微软或者REAL播放器播放视频。

在互联网上提供FLV视频的有两类网站,一种是专门的视频分享网站如美国的YouTube网站、国内的六间房、土豆网等。另一种是门户网站提供了视频播客的板块,提供了自己的视频频道,如新浪视频播客等,也是使用FLV格式的视频。此外,百度也推出了关于视频搜索的功能,里面搜索出来的视频基本都是采用了流行的FLV格式。

Web 2.0时代,要说什么类型网站最火,自然是以国外的Youtube,国内的优酷、土豆网、UUME为代表的视频分享网站了。这类网站提供的视频内容可谓各有千秋,但它们无一例外的都使用了Flash作为视频播放载体,支撑这些视频网站的技术基础就是——Flash 视频(FLV) 。

FLV 是一种全新的流媒体视频格式,它利用了网页上广泛使用的Flash Player 平台,将视频整合到Flash动画中。也就是说,网站的访问者只要能看Flash动画,自然也能看FLV格式视频,而无需再额外安装其它视频插件,FLV视频的使用给视频传播带来了极大便利。

FLV是一个二进制文件,由文件头(FLV header)和很多tag组成。tag又可以分成三类:audio,video,script,分别代表音频流,视频流,脚本流(关键字或者文件信息之类)。
FLV文件=FLV头文件+ tag1+tag内容1 + tag2+tag内容2 + ...+... + tagN+tag内容N。

FLV头文件
一般比较简单,包括文件类型之类的全局信息
文件类型3bytes 总是FLV(0x46 0x4C 0x56)
版本1byte 一般是0x01,表示FLV version 1
流信息1byte 倒数第一bit是1表示有视频,倒数第三bit是1表示有音频,其他都应该是0(有些软件如flvtool2可能造成倒数第四bit是1,不过也没发现有什么不对)
header长度4bytes 整个文件头的长度,一般是9(3+1+1+4),有时候后面还有些别的信息,就不是9了
FLV头文件:(9字节)
1-3: 前3个字节是文件格式标识(FLV 0x46 0x4C 0x56).
4-4: 第4个字节是版本(0x01)
5-5: 第5个字节的前5个bit是保留的必须是0.
6-9: 第6-9的四个字节还是保留的.其数据为 00000009 .
整个文件头的长度,一般是9(3+1+1+4)

文件元信息

flv文件中的元信息,是一些描述flv文件各类属性的信息。这些信息以AMF格式保存在文件的起始部分。adobe官方的标准flv元信息项目如下:
audiochannels
audiocodecid
audiodatarate
audiodevice
audioinputvolume
audiosamplerate
creationdate
duration (media files only)
fmleversion (Flash Media Live Encoder version) (media files only)
framerate
height
lastkeyframetimestamp (media files only)
lasttimestamp (media files only)
presetname
videocodecid
videodatarate
videodevice
videokeyframe_frequency
width
两个常用的操作metadata的工具是flvtool2和FLVMDI,都是把keyframes作为一个默认的元信息 项目。


FLV Body
FLV body就是由很多tag组成的,一个tag包括下列信息:
previoustagsize 4bytes 前一个tag的长度,第一个tag就是0
tag类型1byte
三类:
* 8 -- 音频tag
* 9 -- 视频tag
* 18 -- 脚本tag
数据区长度3bytes时间戳3bytes 单位毫秒,如果是脚本tag就是0
扩展时间戳1byte 作为时间戳的高位
streamsID 3bytes 总是0(不知道干啥用)
数据区
根据不同的tag类型就有不同的数据区
Audio tag 数据区
audio信息1byte

前四位bits表示音频格式:
* 0 -- 未压缩
* 1 -- ADPCM
* 2 -- MP3
* 5 -- Nellymoser 8kHz momo
* 6 -- Nellymoser
下面两位bits表示samplerate:
* 0 -- 5.5kHz
* 1 -- 11kHz
* 2 -- 22kHz
* 3 -- 44kHz
下面一位bit表示每个采样的长度:
* 0 -- snd8Bit
* 1 -- snd16Bit
下面一位bit表示类型:
* 0 -- sndMomo
* 1 -- sndStereo
audio数据区
不定
video tag 数据区
video信息1byte
前四位bits表示类型:
* 1 -- keyframe
* 2 -- inner frame
* 3 -- disposable inner frame (H.263 only)
后四位bits表示编码器id:
* 2 -- Seronson H.263
* 3 -- Screen video
* 4 -- On2 VP6
* 5 -- On2 VP6 without channel
* 6 -- Screen video version 2
video数据区
不定
ScriptTagData结构(控制帧)
该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的参数信息如:duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。
前11个字节为Tag Header结构 第一个AMF包(13字节):
第1个字节表示AMF包类型,一般总是0x02,表示字符串
第2-3个字节为UI16类型值,一般总是0x000A(“onMetaData”长度)。 后面字节一般总为“onMetaData”。(6F,6E,4D,65,74,61,44,61,74,61) 第二个AMF包:
第1个字节表示AMF包类型,一般总是0x08,表示数组。 第2-5个字节为UI32类型值,表示数组元素的个数。
后面即为各数组元素的封装,数组元素为元素名称和值组成的对。表示方法如下: 第1-2个字节表示元素名称的长度,假设为L。 后面跟着为长度为L的字符串。 第L+3个字节表示元素值的类型。
后面跟着为对应值,占用字节数取决于值的类型。


tag格式


tag类型信息,固定长度为15字节
1-4: 前一个tag长度(4字节),第一个tag就是0
5-5: tag类型(1字节);0x8音频;0x9视频;0x12脚本数据
6-8: tag内容大小(3字节)
9-11: 时间戳(3字节)(毫秒)(第1个tag的时候总是为0,如果是脚本tag就是0)
12-12: 时间戳扩展(1字节)让时间戳变成4字节(以存储更长时间的flv时间信息),本字节作为时间戳的最高位.
在flv回放过程中,播放顺序是按照tag的时间戳顺序播放.任何加入到文件中时间设置数据格式都将被忽略.
13-15: streamID(3字节) 总是0

2 0
原创粉丝点击