怎么查看网站啥系统做的,宁波网站设计制作,做一个自我介绍的网页,机械加工种类FLV协议简介 FLV#xff08;Flash Video#xff09;是一种流媒体格式#xff0c;因其体积小、协议相对简单#xff0c;很快便流行开来#xff0c;并得到广泛的支持。 常见的HTTP-FLV直播协议#xff0c;就是使用HTTP流式传输通过FLV封装的音视频数据。对想要了解HTTP-FLV…FLV协议简介 FLVFlash Video是一种流媒体格式因其体积小、协议相对简单很快便流行开来并得到广泛的支持。 常见的HTTP-FLV直播协议就是使用HTTP流式传输通过FLV封装的音视频数据。对想要了解HTTP-FLV的同学来说了解FLV协议很有必要。 概括地说FLV 由 FLV header 跟 FLV file body 两部分组成而 FLV file body 又由多个 FLV tag组成。 FLV FLV header FLV file body FLV file body PreviousTagSize0 Tag1 PreviousTagSize1 Tag2 ... PreviousTagSizeN-1 TagN FLV tag又分为3种类型 Video Tag存放视频相关数据Audio Tag存放音频相关数据Script Tag存放音视频元数据在实际讲解FLV协议前首先对单位进行约定 类型定义0x...16进制数据SI8有符号8位整数SI16有符号16位整数SI24有符号24位整数SI32有符号32位整数STRINGSequence of Unicode 8-bit characters (UTF-8), terminated with 0x00 (unless otherwise specified)UI8无符号8位整数UI16无符号16位整数UI24无符号24位整数UI32无符号32位整数xxx [ ]类型为xxx的数组xxx [n]类型为xxx的数组数组长度为nFLV header FLV header由如下字段组成其中 前三个字节内容固定是FLV最后4个字节内容固定是9对FLV版本1来说字段字段类型字段含义SignatureUI8签名固定为F (0x46)SignatureUI8签名固定为L (0x4c)SignatureUI8签名固定为V (0x56)VersionUI8版本比如 0x01 表示 FLV 版本 1TypeFlagsReservedUB[5]全为0TypeFlagsAudioUB[1]1表示有audio tag0表示没有TypeFlagsReservedUB[1]全为0TypeFlagsVideoUB[1]1表示有video tag0表示没有DataOffsetUI32FLV header的大小单位是字节FLV file body FLV file body很有规律由一系列的TagSize和Tag组成其中 PreviousTagSize0 总是为0tag 由tag header、tag body组成对FLV版本1tag header固定为11个字节因此PreviousTagSize除第1个的值为 11 前一个tag 的 tag body的大小字段字段类型字段含义PreviousTagSize0UI32总是0Tag1FLVTAG第1个tagPreviousTagSize1UI32前一个tag的大小包括tag headerTag2FLVTAG第2个tag.........PreviousTagSizeN-1UI32第N-1个tag的大小TagNFLVTAG第N个tagPreviousTagSizeNUI32第N个tag的大小包含tag headerFLV tags FLV tag由 tag header tag body组成。 tag header如下总共占据11个字节 字段字段类型字段含义TagTypeUI8tag类型 8audio 9video 18script data 其他保留DataSizeUI24tag body的大小TimestampUI24相对于第一个tag的时间戳单位是毫秒 第一个tag的Timestamp为0TimestampExtendedUI8时间戳的扩展字段当 Timestamp 3个字节不够时会启用这个字段代表高8位StreamIDUI24总是0Data取决于根据TagTypeTagType8则为AUDIODATA TagType9则为VIDEODATA TagType18则为SCRIPTDATAOBJECT In playback, the time sequencing of FLV tags depends on the FLV timestamps only. Any timing mechanisms built into the payload data format are ignored. Audio tags 定义如下所示 字段字段类型字段含义SoundFormatUB[4]音频格式重点关注 **10 AAC ** 0 Linear PCM, platform endian 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 SoundRateUB[2]采样率对AAC来说永远等于3 0 5.5-kHz 1 11-kHz 2 22-kHz 3 44-kHzSoundSizeUB[1]采样精度对于压缩过的音频永远是16位 0 snd8Bit 1 snd16BitSoundTypeUB[1]声道类型对Nellymoser来说永远是单声道对AAC来说永远是双声道 0 sndMono 单声道 1 sndStereo 双声道SoundDataUI8[size of sound data]如果是AAC则为 AACAUDIODATA 其他请参考规范备注 If the SoundFormat indicates AAC, the SoundType should be set to 1 (stereo) and the SoundRate should be set to 3 (44 kHz). However, this does not mean that AAC audio in FLV is always stereo, 44 kHz data. Instead, the Flash Player ignores these values and extracts the channel and sample rate data is encoded in the AAC bitstream. AACAUDIODATA 当 SoundFormat 为10时表示音频采AAC进行编码此时SoundData的定义如下 字段字段类型字段含义AACPacketTypeUI80: AAC sequence header 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 type
if (object type 31)6 bits 32: object type
4 bits: frequency index
if (frequency index 15)24 bits: frequency
4 bits: channel configuration
var bits: AOT Specific Config
复制代码定义如下 字段字段类型字段含义AudioObjectTypeUB[5]编码器类型比如2表示AAC-LCSamplingFrequencyIndexUB[4]采样率索引值比如4表示44100SamplingFrequencyIndexUB[4]采样率索引值比如4表示44100ChannelConfigurationUB[4]声道配置比如2代表双声道front-left, front-rightVideo 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]编解码器主要关注 7AVC 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: AVCVIDEOPACKEAVCVIDEOPACKE 当 CodecID 为 7 时VideoData 为 AVCVIDEOPACKE也即 H.264媒体数据。 AVCVIDEOPACKE 的定义如下 字段字段类型字段含义AVCPacketTypeUI80: AVC sequence header 1: AVC NALU 2: AVC end of sequenceCompositionTimeSI24如果AVCPacketType1则为时间cts偏移量否则为0DataUI8[n]1、如果如果AVCPacketType1则为AVCDecoderConfigurationRecord 2、如果AVCPacketType12则为NALU一个或多个 3、如果AVCPacketType2则为空这里有几点稍微解释下 NALUH.264中将数据按照特定规则格式化后得到的抽象逻辑单元称为NALU。这里的数据既包括了编码后的视频数据也包括视频解码需要用到的参数集PPS、SPS。AVCDecoderConfigurationRecordH.264 视频解码所需要的参数集SPS、PPSCTS当B帧的存在时视频解码呈现过程中dts、pts可能不同cts的计算公式为 pts - dts/90单位为毫秒如果B帧不存在则cts固定为0PPS、SPS这里先不展开。 Script Data Tags Script Data Tags通常用来存放跟FLV中音视频相关的元数据信息onMetaData比如时长、长度、宽度等。它的定义相对复杂些采用AMFAction 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如果Type3则为SCRIPTDATAOBJECTEND 如果 Type8则为SCRIPTDATAVARIABLEENDObject、Array的结束符可以看到Script Data Tag 的定义相对复杂下面通过onMetaData进行进一步讲解。 onMetaData onMetaData中包含了音视频相关的元数据封装在Script Data Tag中它包含了两个AMF。 第一个AMF 第1个字节0x02表示字符串类型第2-3个字节UI16类型值为0x000A表示字符串的长度为10onMetaData的长度第4-13个字节字符串onMetaData对应的16进制数字0x6F 0x6E 0x4D 0x65 0x74 0x61 0x44 0x61 0x74 0x61第二个AMF 第1个字节0x08表示数组类型第2-5个字节UI32类型表示数组的长度onMetaData中具体包含哪些属性是不固定的。第6个字节比如duration则 第6-9个字节0x0008表示长度为8个字节第10-17个字节0x6475 7261 7469表示 duration 这个字符串第18个字节0x00表示为数值类型第19-26个字节0x...表示具体的时长更多onMetaData字段的定义 字段字段类型字段含义durationDOUBLE文件的时长widthDOUBLE视频宽度pxheightDOUBLE视频高度pxvideodatarateDOUBLE视频比特率kb/sframerateDOUBLE视频帧率帧/svideocodecidDOUBLE视频编解码器ID参考Video TagaudiosamplerateDOUBLE音频采样率audiosamplesizeDOUBLE音频采样精度参考Audio TagstereoBOOL是否立体声audiocodecidDOUBLE音频编解码器ID参考Audio TagfilesizeDOUBLE文件总得大小字节写在后面 FLV协议本身不算复杂理解上的困难更多时候来自音视频编解码相关的知识比如H.264、AAC相关知识建议不懂的时候自行查下。此外FLV的字节序为大端序在做协议解析的时候一定要注意。 本文为讲解方便部分内容可能不够严谨如有错漏敬请指出。 相关链接 video_file_format_spec_v10.pdf www.adobe.com/content/dam… MPEG-4 Part 3 en.wikipedia.org/wiki/MPEG-4… flv文件分析 www.jianshu.com/p/e290dca02… H.264再学习 -- 详解 H.264 NALU语法结构 blog.csdn.net/qq_29350001… 转载于:https://juejin.im/post/5d50b5176fb9a06b2116dae9