RTMP/FLV学习注意要点
1.RTMP和FLV格式友好的兼容性,主要体现在RTMP封装可播放的音视频流时,仔细研究一下,你会发现,RTMP Packet中封装的音视频数据流时,其实和FLV/tag封装音频和视频数据的方式是相同的,所以,我们只需要按照FLV封装H264和AAC的方式,即可生成可播放流。只不过视频相关包包括:onMetaData,AVCDecoderConfigurationRecord,h264数据。和flv文件中的区别是flv文件用tag头,rtmp中相关信息是放在rtmp头中。至于内部内容是一样的。友好的兼容性带了的便捷,比如RTMP流媒体服务器可以直接将RTMP Packet作为FLV/tag写入文件,只需要稍微处理一些FLV头既可以保存成FLV文件。
2.在FLV文件格式中,VPacketType代表着此Tag内所包含的内容的类型,当AVPacketType = 0x00(序列头)的时候,说明此Tag中包含的是头信息,为0x01的时候是关键帧,为0x02的时候是P帧或者B帧,在这里有两点值得注意一下:AVPacketType = 0x00,只有在ScriptData(对应RTMP/FLV中的onMetaData)之后的第一个Tag内才会出现,其他时候不会出现,第二点就是,当AVPacketType为0x01的时候,此Tag会包含4个Nalu单元,分别是SPS , PPS, SEI,和IDR帧。注意:针对第一点,ScriptData(对应RTMP/FLV中的onMetaData)之后的第一个Tag中AVCVIDEOPACKET部分同时包含SPS和PPS的NALU;第二点,在RTMP/FLV中,为了避免后面观看的客户端无法解码,需要在I帧前带上SPS,PPS等解码信息。参考:http://blog.youkuaiyun.com/nvniaobi/article/details/49978935
3.一个tag至少需要包含一个完整的帧,如果一个NALU包含一个完整的帧,则好处理,H264码流中此Nalu的头0x00 00 00 01或者0x00 00 01去掉,然后放到Data字段中去就OK了;如果需要一个tag包含多个NALU,则需要增加NALU的长度字段,如下图。参考:http://blog.youkuaiyun.com/nvniaobi/article/details/49978935