音视频封装flv和http-flv

FLV(Flash Video)是Adobe公司设计开发的一种流行的流媒体格式,由于其视频文件体积轻巧、封装简单等特点,使其很适合在互联网上进行应用。此外,FLV可以使用Flash Player进行播放,而Flash Player插件已经安装在全世界绝大部分浏览器上,这使得通过网页播放FLV视频十分容易。目前主流的视频网站无一例外地使用了FLV格式。FLV封装格式的文件后缀通常为“.flv”。

一、FLV结构

FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag组成。

其中,每个Tag前面还包含了Previous Tag Size字段,表示前面一个Tag的大小。

Tag的类型可以是视频、音频和Script,每个Tag只能包含以上三种类型的数据中的一种。

下面详细介绍一下三种Tag的Tag Data部分的结构(不同类型tag,tag data不同)。

1.1 Audio Tag Data结构(音频Tag)

音频Tag开始的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。

第1个字节的前4位的数值表示了音频编码类型。

 

如果SoundFormat=10,那么音频数据就是AACAUDIODATA。

1.2 Video Tag Data结构(视频Tag)

视频Tag也用开始的第1个字节包含视频数据的参数信息,从第2个字节为视频流数据。

对于H.264数据来说,CodecID = 7,视频数据就是AVCVIDEOPACKET格式。

  • 如果 AVCPacketType = 0,那么Data就是AVCDecoderConfigurationRecord格式。

  • 如果 AVCPacketType = 1,那么Data结构就简单了。

Nalu len(UI32) | Nalu Data(UI8[n]) | Nalu len(UI32) | Nalu Data(UI8[n]) | ......

示例:

Tag Header:

Type:09(Tag的类型,包括音频(0x08)、视频(0x09)、script data(0x12))
Datasize:00 00 2e(Tag Data 部分的大小)
Timestamp:00 00 00(时间戳)
Timestamp_ex:00(时间戳的扩展部分)
StreamID:00 00 00(总是0)

Tag data:

FrameType | CodecID:17(keyframe | AVC)(视频tag的参数)

因为CodecID=7,所以视频数据就是AVCVIDEOPACKET格式

AVCVIDEOPACKET:

AVCPaketType:00(ACVPacket的类型,0: AVC sequence header;1: AVC NALU;2: AVC end of sequence)
CompositionTime:00 00 00

因为ACVPaketType==0,所以Data=AVCDecoderConfigurationRecord

AVCDecoderConfigurationRecord:

configurationVersion:01
AVCProfileIndication:64
profile_compatibility:00
AVCLevelIndication:1e
lengthSizeMinusOne:ff (NALUSize的长度,计算方法为:1 + (lengthSizeMinusOne & 3)=4)
numOfSequenceParameterSets:e1(低五位为SPS的个数,计算方法为:numOfSequenceParameterSets & 0x1F=1)
sequenceParameterSetLength:00 18(SPS的长度,24)
sequenceParameterSetNALUnits:67 64 00 1e ac d9 40 a0 33 b0 11 00 00 03 02 47 00 00 6d 34 0f 16 2d 96(SPS)
numOfPictureParameterSets:01(PPS的个数)
pictureParameterSetLength:00 06(PPS的长度)
pictureParameterSetNALUnits:68 eb e3 cb 22 c0(PPS)
previousTagSize:00 00 00 39

1.3 Script Tag Data结构(控制帧)

该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的元数据信息如:duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。

第一个字节表示AMF包的类型:

第一个AMF包:

第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类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常见的数组元素如表7所示。

 

二、HTTP-FLV

HTTP-FLV,即将音视频数据封装成 FLV,然后通过 HTTP 协议传输给客户端。

流(stream): 数据在网络上按时间先后次序传输和播放的连续音/视频数据流。之所以可以按照顺序传输和播放连续是因为在类似 RTMP、FLV 协议中,每一个音视频数据都被封装成了包含时间戳信息头的数据包。而当播放器拿到这些数据包解包的时候能够根据时间戳信息把这些音视频数据和之前到达的音视频数据连续起来播放。MP4、MKV 等等类似这种封装,必须拿到完整的音视频文件才能播放,因为里面的单个音视频数据块不带有时间戳信息,播放器不能将这些没有时间戳信息数据块连续起来,所以就不能实时的解码播放。

 

参考:

1. 视音频编解码学习工程:FLV封装格式分析器 leixiaohua

2. FLV格式详解

3. FLV文件(H264+AAC)格式超详细分析

4. FLV 封装格式解析 叶余

posted @ 2016-04-05 13:55  yuxi_o  阅读(529)  评论(0编辑  收藏  举报