flv格式是由adobe公司制定的一种比较简单的流媒体存储格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了FLV格式。另外由于当前浏览器与Flash Player紧密的结合,使得网页播放FLV视频轻而易举,也是FLV流行的原因之一。
而且现在几乎所有的直播平台,都采用rtmp协议进行音视频数据的传输,而rtmp中的消息体,就是flv tag中的tag data,即rtmp消息使用flv的tag data格式来封装其消息内容,所以了解它的格式非常有必要。
从整个文件上来看,FLV是由The FLV header 和 The FLV File Body 组成.
其格式大体如下图:

它由一个头部和若干个tag组成,这些tag类型包括:script data,video data,audio data;script data即metadata
flv header:9字节
格式(注意图中TypeFlagsVideo对于的是第0位):
[图片上传失败...(image-ae674d-1561371025375)]
格式(go语言实现):
type SrsFlvHeader struct {
signature []byte //3byte,FLV
version byte
flags byte //第0位和第2位,分别表示 audio 与 video 存在的情况.(1表示存在,0表示不存在)。
headerSize []byte //即自身的总长度,一直为9, 4字节(注:flv使用的是大端格式)
}
flv body:
[图片上传失败...(image-efdb20-1561371025375)]
PreviousTagSize:前一个tag的大小(tag header+tag data)
至于这里为什么放后面,先不管了,可能是为了拖动定位方便吧
flv的body就是由一个一个tag组成的,每个tag由tag header及tag data组成:
[图片上传失败...(image-dd3c8b-1561371025375)]
tag header格式(注意这里是大端格式):
type TagHeader struct {
tagType byte
dataSize []byte //3byte
timestamp []byte //4byte
reserved []byte //全0
}
script tag data格式:
见图:

具体的内部内容,是一个amf0的data,包含一个amf0 string及amf0 object;
amf0 string一般为onMetaData;
amf0 object包含宽,高,码率,编码器,音频码率,采样率等等信息。
video tag data格式:

从图中可以看出,第一字节的高4位表示帧类型(关键帧,p帧等),低4位表示编解码器信息:

第一字节的低4位表示编码器信息,一般我们都是7(AVC/H264)
接下来,第二字节表示AVCPacketType:
类型 | 说明 |
---|---|
AVCPacketType=0x00 | AVCSequence Header |
AVCPacketType=0x01 | 为AVC NALU |
AVCPacketType=0x02 | 为AVC end ofsequence |
见图:


第三字节,CompositionTime为相对时间戳:
如果AVCPacketType=0x01, 为相对时间戳;
其它,均为0;
audio tag格式:
第一字节:
soundFormat(4bit)|soundRate(2bit)|soundSize(1bit)|soundType(1bit)
- SoundFormat: (4 bits)
1 = ADPCM
2 = MP3
3 = Linear PCM, little endian
4 = Nellymoser 16 - kHz mono
5 = Nellymoser 8 - kHz mono
6 = Nellymoser
7 = G.711 A - law logarithmic PCM
8 = G.711 mu - law logarithmic PCM
9 = reserved
10 = AAC
11 = Speex
14 = MP3 8 - Khz
15 = Device - specific sound - SoundRate: (2 bits)
0 = 5.5-kHz
1 = 11 - kHz
2 = 22 - kHz
3 = 44 - kHz - SoundSize: (1 bit)
0 = snd8Bit
1 = snd16Bit -
SoundType: (1 bit)
0 = sndMono
1 = sndStereo
如图:
audio tag第一字节
第二字节:
AACPacketType,这个字段来表示AACAUDIODATA的类型:0 = AAC sequence header,1 = AAC raw

data这里就不贴了。
以上就是flv格式的一个分析。
网友评论