挑干货简单说~~~~~~~
FLV文件时由 FLV文件头(FLV header)和 FLV文件体(FLV body)组成的。
FLV body又是由 (previous tag size 和 flv tag)* N 组成的。
一 FLV header:
FLV header 中包含的信息有 文件类型 FLV版本 stream信息 FLV header 长度。这个Header长度一般都是固定的9个字节:
二 FLV body:
FLV body中包含很多个FLV tag,tag的分类有三种:0x8音频、0x9视频、0x12脚本。每个tag中包含tag头和tag体。
每个tag前面还有一个previous size包 记录这上一个tag的数据的长度。先简单说一下tag head:
1byte Tag类型,3bytes数据长度记录,3bytes时间戳,一个扩展时间戳bype,3bytes StreamID,图上面应该很清楚了。
FLV header 后紧跟着的是脚本tag:
2.1 脚本tag:
脚本tag 0x12(script tag),脚本tag描述了媒体信息,比如视频的width 和 height ,帧率等等信息:
上图中为一个脚本tag的数据截图,脚本tag在tag头后面的tag数据中一般会包含两个AMF包,AMF是Adobe设计的一种通用数据封装格式。在第一个AMF包中有一个字符串类型的值,该值为onMetaDate。第二个AMF包封装一个“数据组”,每一组数据都有自己的元素名、元素类型、元素值、这里不详细描述,我会再这篇博客里面详细解释一下AMF怎么编解码。(研究AMF这里时候看了好多资料,好坑啊,感觉网上的文章都不知道在哪抄的,错的地方都一样 fuck)
2.2 视频tag:
视频tag 0x9 视频tag头都是一样的,1byte Tag类型,3bytes数据长度记录,3bytes时间戳,一个扩展时间戳bype,3bytes StreamID。
视频tag头后面的第一byte 的4bit表示视频数据的类型,后4bit表示视频的编码器ID
数据类型:1<->keyframe、2<->innerframe、3<->disposable inner frame(h.263)、4<->generated keyframe
编码器ID:2<->h.263、3<->screen video、4<->On2 VP6、5<->On2 VP6 with alpha channel、6<->Screen video version、7<->AVC h264
2.3 音频tag
音频tag0x8 和视频相比tagtype为0x8 tag header 都是一样的后面跟着的 tag数据类型:
音频tag占1byte 前4bit表示音频格式(比如MP3),接着2bit表示采样率,接着1bit表示采样长度接着1bit表示音频类型
音频格式:0<->未压缩、1<->ADPCM、2<->MP3、4<->Nellymoser 16-Hz mono、5<->Nellymoser 8-kHz mono、
10<->AAC
采样率: 0<->5.5kHz、1<->11kHz、2<->22kHz、3<->44kHz
采样长度:0<->snd8bit、1<->16bit
音配类型:0<->sndMono 1<->sndStereo
后续就是音频的数据了。
下面这个链接对FLV分析的很详细可以结合我这个图来看 理解会更容易一些: