FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发 视频学习地址 Flv文件格式Flv 由 Flv header 和 Flv Body组成。 Flv Body 由一系列的 Tag 组成,每个 Tag 又有一个 preTagSize 字段,标记着前面一个 Tag 的大小。  Flv Header下图是 Flv Header 的内容,(UI8表示无符号8位,也就是一个字节;UB[5]表示一个字节中的5位)  Flv BodyFlv Body 由一个一个 Tag 组成,每个 Tag 都有一个 preTagSize 字段,标记着前面一个 Tag的大小。  Tag有三种类型,Audio Tag(音频Tag),Video Tag(视频Tag),script Tag(又称Metadata Tag) 每个Tag由Tag Header和Tag Data组成,对于不同类型的 Tag,Tag Header的格式都是相同的,Tag Body的格式就不一样了。  下面这张图归纳一下上面讲的内容,看完后对 flv 应该有个总体的了解了。  一般一个 flv 文件由一个头部信息,一个 script Tag,以及若干个 video Tag 和 audio Tag 组成。  下面来详细讲解每种类型的 Tag Data  Tag DataFlv 有三种tag:Audio Tag Data、Video Tag Data、Script Tag Data 1、Audio Tag Data 如果 SoundFormat=10,那么音频数据就是 AACAUDIODATA 。 AACAUDIODATA 格式如下:  2、Video Tag Data 对于H.264数据来说,CodecID = 7。 当CodecID = 7时,视频数据就是AVCVIDEOPACKET格式。 下面讲解一下AVCVIDEOPACKET。  如果 AVCPacketType = 0,那么 Data 就是 AVCDecoderConfigurationRecord 格式。 以下是AVCDecoderConfigurationRecord的结构  如果 AVCPacketType = 1,那么 Data 结构就简单多了。  说这么多可能有点乱了,下面来解析一个实例  Tag Header: Type:09(Tag的类型,包括音频(0x08)、视频(0x09)、scriptdata(0x12))Datasize:00002e(TagData部分的大小)Timestamp:000000(时间戳)Timestamp_ex:00(时间戳的扩展部分)StreamID:000000(总是0)
Tag data: FrameType|CodecID:17(keyframe|AVC)(视频tag的参数)
因为CodecID=7,所以视频数据就是 AVCVIDEOPACKET 格式 AVCVIDEOPACKET: AVCPaketType:00(ACVPacket的类型,0:AVCsequenceheader;1:AVCNALU;2:AVCendofsequence)CompositionTime:000000
因为 ACVPaketType==0,所以 Data=AVCDecoderConfigurationRecord AVCDecoderConfigurationRecord: configurationVersion:01AVCProfileIndication:64profile_compatibility:00AVCLevelIndication:1elengthSizeMinusOne:ff(NALUSize的长度,计算方法为:1+(lengthSizeMinusOne&3)=4)numOfSequenceParameterSets:e1(低五位为SPS的个数,计算方法为:numOfSequenceParameterSets&0x1F=1)sequenceParameterSetLength:0018(SPS的长度,24)sequenceParameterSetNALUnits:6764001eacd940a033b011000003024700006d340f162d96(SPS)numOfPictureParameterSets:01(PPS的个数)pictureParameterSetLength:0006(PPS的长度)pictureParameterSetNALUnits:68ebe3cb22c0(PPS)previousTagSize:00000039
3、Script Tag Data该类型 Tag 又通常被称为 MetadataTag,会放一些关于 FLV 视频和音频的元数据信息如:duration、width、height 等。通常该类型 Tag 会跟在 FileHeader 后面作为第一个 Tag 出现,而且只有一个。 结构如下图所示  AMF包:第一个字节表示 AMF包 的类型  第一个 AMF包: 第一个字节一般为0x02,表示字符串,第2-3个字节表示字符串的长度,一般为0x000A,后面跟的就是字符串,一般为"onMetaData"。 第二个 AMF包: 第一个字节为0x08,表示数组,第2-5个字节表示数组元素个数,后面跟着就是数组的元素,格式为:元素名长度(UI16) + 元素名(UI8[n]) + 元素的值(double),最后以009结尾。 常见的数组元素  欢迎朋友们加入学习交流群:960994558群内提供一些免费的FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发学习资料资料  |