娄底网站制作,备案号查询平台,免费空间网,跨境电商seo本文将介绍如何将H.264封装成flv格式。在看本文之间#xff0c;建议先看一看下面两篇文章#xff1a;首先说一说构建一个FLV文件需要什么#xff1f;FLV Header FLv script tag FLV Video tag FLV Audio tag由于这里只是封装H.264#xff0c;所以不包括Audio tag。下面将…本文将介绍如何将H.264封装成flv格式。在看本文之间建议先看一看下面两篇文章首先说一说构建一个FLV文件需要什么FLV Header FLv script tag FLV Video tag FLV Audio tag由于这里只是封装H.264所以不包括Audio tag。下面将通过分析示例来说明FLV Header FLv script tag FLV Video tag这三部分如何构建。1、FLV Header通过阅读上面的文章《FLV格式详解》应该就很清楚FLV Header的内容了。下面来分析一个实例Signature0x46(F)Signature0x4c(L)Signature0x56(V)Version01Flags01TypeFlagsReserved [Bit 3-7]0TypeFlagsAudio [Bit 2]0TypeFlagsReserved [Bit 1]0TypeFlagsVideo [Bit 0]1DataOffset00 00 00 09preTagSize00 00 00 00 // 第一个tag默认为02、FLv script tag又称Metadata Tag位于flv header后的第一个tag下面来分析一个实例Tag HeaderTagType12(表示这是一个script tag)Datasize00 00 9f(Tag Data 部分的大小)Timestamp00 00 00(该Tag的时间戳)Timestamp_ex00(时间戳的扩展部分)StreamID00 00 00(总是0)Tag data因为TagType为0x12所以这部分的数据为两个AMF包第一个AMF包type02(表示字符串)stringLen00 0a(字符串长度为10)string6f 6e 4d 65 74 61 44 61 74 61(onMetaData)第二个AMF包type08(表示数组)arrayNum00 00 00 07(数组元素个数)stringLen00 08(第一个数组元素字符串长度)string64 75 72 61 74 69 6f 6e(duration)valType00(数据类型double型)val40 03 70 a3 d7 0a 3d 71(double型)stringLen00 05string77 69 64 74 68(width)...end00 00 09preTagSize00 00 00 aa3、FLV Video Tag这部分封装着图像数据也就是H.264的数据封装在这里。H.264是由一个一个NALU组成NALU的类型有(SPS、PPS、I帧的SLICE、非I帧的SLICE)封装H.264就是将这些NALU一个一个取出来然后封装成Tag。需要注意的是SPS与PPS必须封装在一个Tag中。下面分别通过实例来分析各种NALU(SPS、PPS、I帧的SLICE、SEI、非I帧的SLICE)是怎么封装的。1、SPS与PPSTag HeaderTagType09(Tag的类型包括音频(0x08)、视频(0x09)、script data(0x12))Datasize00 00 2e(Tag Data 部分的大小)Timestamp00 00 00(时间戳19ms)Timestamp_ex00(时间戳的扩展部分)StreamID00 00 00(总是0)Tag dataFrameType | CodecID17(keyframe | AVC)(视频tag的参数)AVCVideoPaket(因为CodecID7所以VideoData为AVCVideoPaket)AVCPaketType00(ACVPacket的类型0: AVC sequence header1: AVC NALU2: AVC end of sequence)CompositionTime00 00 00(因为ACVPaketType0所以DataAVCDecoderConfigurationRecord)AVCDecoderConfigurationRecordconfigurationVersion01AVCProfileIndication64profile_compatibility00AVCLevelIndication1elengthSizeMinusOneffnumOfSequenceParameterSetse1(低五位为SPS的个数计算方法为numOfSequenceParameterSets 0x1F1)sequenceParameterSetLength00 18(SPS的长度24)sequenceParameterSetNALUnits67 64 00 1e ac d9 40 a0 33 b0 11 00 00 03 02 47 00 00 6d 34 0f 16 2d 96(SPS)numOfPictureParameterSets01(PPS的个数)pictureParameterSetLength00 06(PPS的长度)pictureParameterSetNALUnits68 eb e3 cb 22 c0(PPS)previousTagSize00 00 00 392、I帧的SLICETag HeaderTagType09(Tag的类型包括音频(0x08)、视频(0x09)、script data(0x12))Datasize00 35 78(Tag Data 部分的大小)Timestamp00 00 0a(时间戳19ms)Timestamp_ex00(时间戳的扩展部分)StreamID00 00 00(总是0)Tag dataFrameType | CodecID17(key frame | AVC)(视频tag的参数)因为CodecID7所以VideoData为AVCVideoPaketAVCVideoPaketAVCPaketType01(ACVPacket的类型0: AVC sequence header1: AVC NALU2: AVC end of sequence)CompositionTime00 00 0aNaluLen00 00 35 6fNaluData...preTagSize00 00 35 83对于SEI的封装跟I帧是一样的。3、非I帧的SLICE非I帧的封装格式和I帧的封装格式基本一样唯一不同的是FrameType | CodecID部分应该设置为FrameType | CodecID27(inter frame | AVC)(视频tag的参数)总结以上通过实例讲解了FLV的头部信息script tag以及H.264不同类型的NALU如何封装成tag下面放出源码。