FLV协议5分钟入门浅析( 二 )
1: AAC rawDataUI8[n]如果AACPacketType为0,则为AudIOSpecificConfig
如果AACPacketType为1,则为AAC帧数据
The AudioSpecificConfig is explained in ISO 14496-3. Note that it is not the same as the contents of the esds box from an MP4/F4V file. This structure is more deeply embedded.关于AudioSpecificConfig
伪代码如下:参考这里
5 bits: object typeif (object type == 31) 6 bits + 32: object type4 bits: frequency indexif (frequency index == 15) 24 bits: frequency4 bits: channel configurationvar bits: AOT Specific Config复制代码定义如下:
字段字段类型字段含义AudioObjectTypeUB[5]编码器类型,比如2表示AAC-LCSamplingFrequencyIndexUB[4]采样率索引值,比如4表示44100SamplingFrequencyIndexUB[4]采样率索引值,比如4表示44100ChannelConfigurationUB[4]声道配置,比如2代表双声道,front-left, front-right
Video tags
定义如下:
字段字段类型字段含义FrameTypeUB[4]重点关注1、2:
1: keyframe (for AVC, a seekable frame) —— 即H.264的IDR帧;
2: inter frame (for AVC, a non- seekable frame) —— H.264的普通I帧;
3: disposable inter frame (H.263 only)
4: generated keyframe (reserved for server use only)
5: video info/command frameCodecIDUB[4]编解码器,主要关注 7(AVC)
1: JPEG (currently unused)
2: Sorenson H.263
3: Screen video
4: On2 VP6
5: On2 VP6 with alpha channel 6: Screen video version 2
7: AVCVideoData取决于CodecID实际的媒体类型,主要关注 7:AVCVIDEOPACKE
2: H263VIDEOPACKET
3: SCREENVIDEOPACKET
4: VP6FLVVIDEOPACKET
5: VP6FLVALPHAVIDEOPACKET
6: SCREENV2VIDEOPACKET
7: AVCVIDEOPACKE
AVCVIDEOPACKE
当 CodecID 为 7 时,VideoData 为 AVCVIDEOPACKE,也即 H.264媒体数据 。
AVCVIDEOPACKE 的定义如下:
字段字段类型字段含义AVCPacketTypeUI80: AVC sequence header
1: AVC NALU
2: AVC end of sequenceCompositionTimeSI24如果AVCPacketType=1,则为时间cts偏移量;否则,为0DataUI8[n]1、如果如果AVCPacketType=1,则为AVCDecoderConfigurationRecord
2、如果AVCPacketType=1=2,则为NALU(一个或多个)
3、如果AVCPacketType=2,则为空
这里有几点稍微解释下:
- NALU:H.264中,将数据按照特定规则格式化后得到的抽象逻辑单元,称为NALU 。这里的数据既包括了编码后的视频数据,也包括视频解码需要用到的参数集(PPS、SPS) 。
- AVCDecoderConfigurationRecord:H.264 视频解码所需要的参数集(SPS、PPS)
- CTS:当B帧的存在时,视频解码呈现过程中,dts、pts可能不同,cts的计算公式为 pts - dts/90,单位为毫秒;如果B帧不存在,则cts固定为0;
Script Data Tags
Script Data Tags通常用来存放跟FLV中音视频相关的元数据信息(onMetaData),比如时长、长度、宽度等 。它的定义相对复杂些,采用AMF(Action Message Format)封装了一系列数据类型,比如字符串、数值、数组等 。
字段字段类型字段含义ObjectsSCRIPTDATAOBJECT[]任意数目的 SCRIPTDATAOBJECTSCRIPTDATAOBJECTENDUI24永远是9,标识着Script Data的结束
SCRIPTDATAOBJECT 定义如下:
字段字段类型字段含义ObjectNameSCRIPTDATASTRING对象的名字ObjectDataSCRIPTDATAVALUE对象的值
SCRIPTDATAVALUE 的定义如下:
字段字段类型字段含义TypeSCRIPTDATASTRING变量类型:
0 = Number type
1 = Boolean type
2 = String type
3 = Object type
4 = MovieClip type
5 = Null type
6 = Undefined type
7 = Reference type 8 = ECMA array type 10 = Strict array type 11 = Date type
12 = Long string typeECMAArrayLength如果Type为8(数组),则为UI32数组长度ScriptDataValueIf Type == 0 DOUBLE
If Type == 1 UI8
If Type == 2 SCRIPTDATASTRING
...(有点长,可以参考规范)变量的值ScriptDataValueTerminator如果Type==3,则为SCRIPTDATAOBJECTEND
如果 Type==8,则为SCRIPTDATAVARIABLEENDObject、Array的结束符
可以看到,Script Data Tag 的定义相对复杂,下面通过onMetaData进行进一步讲解 。
onMetaData
onMetaData中包含了音视频相关的元数据,封装在Script Data Tag中,它包含了两个AMF 。
第一个AMF:
- 第1个字节:0x02,表示字符串类型
- 第2-3个字节:UI16类型,值为0x000A,表示字符串的长度为10(onMetaData的长度);
- 第4-13个字节:字符串onMetaData对应的16进制数字(0x6F 0x6E 0x4D 0x65 0x74 0x61 0x44 0x61 0x74 0x61);
- 第1个字节:0x08,表示数组类型;
- 第2-5个字节:UI32类型,表示数组的长度,onMetaData中具体包含哪些属性是不固定的 。
推荐阅读
- 老中医5分钟教你看懂12经络,最简单的十二经络讲解,收藏了吧!
- 5分钟学会如何不花冤枉钱买到适合的手机
- robots.txt协议如何设置禁止搜索引擎抓取?
- 烤箱第一次使用空烤20分钟可以吗 烤箱空烤10分钟还是15分钟
- “5G下深矿”山西多家煤企与中国移动签署5G战略合作协议
- 程序员需要掌握的一些网络协议汇总
- 附协议范本 注意,离婚协议中这6种约定无效!
- 学习一下OAuth2.0协议
- 不用敲代码,5分钟教会你爬虫
- 个个都有坑!《离婚协议》最容易忽略的7个问题