在做rtmp相关的项目,中间用到FLV格式,这里对FLV格式进行介绍说明。
对于FLV格式的文件,一个文件只包含一种类型的码流,不能音频流和视频流混合存放,也不能将多个同类型码流放到一起。FLV里面的数据是采用大端模式存储。
下面对FLV格式做个整体认识:
FLV由FLVHeader和Tag组成,在每个Tag后面都包含一个四字节的pretagsize表示前一个tag的大小。每个Tag又由TagHeader和TagData两部分组成。
下面分别介绍FLV各个部分的具体内容。
1.FLVHeader,每个FLV文件都由FLVHeader开头。包括以下内容
字段 | 类型 | 说明 |
标识 | UI8 | 第一个字节一直为’F’(0x46) |
标识 | UI8 | 第二个字节一直为’L’(0x4C) |
标识 | UI8 | 第三个字节一直为’V’(0x56) |
版本 | UI8 | FLV版本 0x01版本1 |
类型标识保留 | UB[5] | 保留位置0 |
标识音频 | UB[1] | 1=表示后面都是音频Tags |
类型标识保留 | UB[1] | 保留位置0 |
标识视频 | UB[1] | 1=表示后面都是视频Tags |
数据偏移 | UI32 | FLVHeader的长度 |
数据偏移在FLV版本1里面是9,后续版本可以用来扩展。从上面可以看出如果是音频则第四个表示流类型的值是4,视频则是1。
2.pretagsize字段,类型是UI32也就是4个字节,表示的是它前面的tag的长度。Pretagsize0一直是0。
3.FLV Tag是FLV body,由tagHeader和tagData组成。包括audio、video、scripts三种类型的tag。
3.1 tagHeader 在FLV version 1里面是11个字节,包括以下内容
字段 | 类型 | 说明 |
预留 | UB[2] | 置0 |
过滤 | UB[1] | 包是否需要预处理标志。未加密0 加密 1 |
Tag类型 | UB[5] | Tag类型 8=audio 9=video 18=scriptdata |
TagData部分的大小 | UI24 | 数据大小,从StreamID到tag结束的数据大小 |
时间戳 | UI24 | 毫秒时间戳 |
时间戳扩展 | UI8 | 将时间戳扩展到32位,这个字节表示最高位,其他24位是上面的时间戳 |
StreamID | UI24 | 一直是0 |
3.2 tagData部分根据tag类型不同,类型也有不同,对内容的解析也是不同的。
3.2.1 audiodata
字段 | 类型 | 说明 |
SoundFormat | UB[4] | 音频类型 0=linear PCM platform endian 1=ADPCM 2=MP3 3= linear PCM little endian 4=Nellymoser 16kHz mono 5=Nellymoser 8kHz 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 8kHz 15=Device-specific sound |
SoundRate | UB[2] | 采样率 0=5.5 kHz 1=11 kHz 2=22 kHz 3=44 kHz |
SoundSize | UB[1] | 音频单个采样率位宽,适用于未压缩数据,压缩数据一直是16 0=8 bit 1=16 bit |
SoundType | UB[1] | 单声道或立体声 0=单声道 1=立体声 |
data | UI8[n] | 音频数据载荷 |
这里单独介绍一下音频类型是AAC的音频数据载荷 SoundFormat = 10
字段 | 类型 | 说明 |
AACpacketType | UI8 | 0=AAC sequence header 1=AAC raw |
AACData | If AACPacketType=0 AudioSpecificConfig If AACPacketType=1 Raw AAC UI8[n] | AudioSpecificConfig定义在ISO14496-3 |
3.2.2 VedioData
字段 | 类型 | 说明 |
FrameType | UB[4] | 视频帧类型 1=key frame(for AVC a seekable frame) 2=inter frame(for AVC a non-seekable frame) 3=disposable inter frame(H.263 only) 4=generated key frame(server use only) 5=video info/command frame |
CodecID | UB[4] | 编码标识符 2=Sorenson H.263 3=Screen Video 4=On2PV6 5=On2PV6 with alpha channel 6=Screen Video version 2 7=AVC |
data | UI8[n] | 视频数据载荷 |
对于CodecID=7 AVC 视频数据载荷存在如下格式
字段 | 类型 | 说明 |
AVCPacketType | UI8 | 0=AVC sequence Header 1=AVC NALU 2=AVC end of sequenc |
Composition time | SI24 | If AVCPacketType=1 显示时间偏移 其他为 0 |
Data | UI8[n] | AVCPacketType = 0 AVCDecoderConfigRecord AVCPacketType = 1 one or more NALUS |
AVCDecoderConfigurationRecord的描述参见ISO 14496-15, 5.2.4.1。它包含的信息与将存储在MP4/FLV文件中的avcC框中的信息相同。
3.2.3 script data 这部分数据AMF格式的数据对,这里简单介绍一下AMF0的格式和嵌入在script data 中的OnMetaData的类型数据
AMF0:
字段 | 类型 | 说明 |
Type | UI8 | 0=Number 1=Boolean 2=String 3=Object 4=MovieClip 5=Null 6=Undefined 7=Reference 8=ECMA array 9=Object end maker 10=Strict array 11=Date 12=Long string |
DataValue | If Type=0 DOUBLE If Type=1 UI8 If Type=2 Datastring If Type=3 DataObject If Type=7 UI16 If Type=8 ECMA array If Type=10 Strict array If Type=11 Data If Type=12 Long string | 对应类型的数值 |
AFM0 http: /lopensource.adobe.com/wiki/display/blazeds/Developer+Documentation
OnMateData介绍
属性名称 | AMF Type | 说明 |
audiocodecid | Number | 文件中使用的音频编解码器ID参见SoundFormat值 |
audiodatarate | Number | 音频比特率(千比特/秒) |
audiodelay | Number | 跳频延迟由音频编解码器引入,以秒为单位 |
audiosamplerate | Number | 音频流重放时的数字频率 |
audiosamplesize | Number | 单个音频采样位宽 |
canSeekToEnd | Boolean | 标识最后一帧为关键帧 |
creationdate | String | 报告日期和时间 |
Duration | Number | 文件的总时长单位秒 |
Filesize | Number | 文件的大小 |
framerate | Number | 帧率 |
height | Number | 视频高 |
Stereo | Boolean | 立体声音频 |
Videocodecid | Number | 在文件中使用的视频编解码器标识号参见CodecID |
Videodatarate | Number | 视频比特率 |
width | Number | 视频宽 |