【音视频技术】FLV封装格式

挑干货简单说~~~~~~~

FLV文件时由 FLV文件头(FLV header)和 FLV文件体(FLV body)组成的。

FLV body又是由 (previous tag size 和  flv tag)* N 组成的。

【音视频技术】FLV封装格式_第1张图片

一 FLV header:

    FLV header 中包含的信息有 文件类型 FLV版本 stream信息 FLV header 长度。这个Header长度一般都是固定的9个字节:

【音视频技术】FLV封装格式_第2张图片

二 FLV body:

    FLV body中包含很多个FLV tag,tag的分类有三种:0x8音频、0x9视频、0x12脚本。每个tag中包含tag头和tag体。

每个tag前面还有一个previous size包 记录这上一个tag的数据的长度。先简单说一下tag head:

【音视频技术】FLV封装格式_第3张图片

1byte Tag类型,3bytes数据长度记录,3bytes时间戳,一个扩展时间戳bype,3bytes StreamID,图上面应该很清楚了。

FLV header 后紧跟着的是脚本tag:

    2.1 脚本tag:

【音视频技术】FLV封装格式_第4张图片

        脚本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。

【音视频技术】FLV封装格式_第5张图片

视频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分析的很详细可以结合我这个图来看 理解会更容易一些:

https://blog.csdn.net/bsplover/article/details/7426511

你可能感兴趣的:(音视频技术)