针对FLV格式,目前许多开源项目和常见的视频处理工具和流媒体服务器,仍主要支持H.264视频编码格式,尚未完全兼容H.265。ffmpeg和vlc都不支持H265编码格式的FLV,不知道后续版本会不会支持。RTMP也是用FLV格式传输音视频,这也导致很多RTMP流媒体服务器也不支持H265。本文将介绍FLV如何封装H265。
FLV由FLV Header、PreviousTagSize、Tag组成。如下图所示,为FLV文件结构:
Tag由Tag Header和Tag Data组成,RTMP传输音视频就是传输的Tag Data。Tag有三种类型,Audio Tag(音频Tag),Video Tag(视频Tag),script Tag(又称Metadata Tag),结构如下图所示:
接下来重点看一下视频的Tag Data,如下图所示:
如果CodecId=7则表示视频是H264编码,就是AVCVIDEOPACKET格式,如下图所示:
如果 AVCPacketType = 0,那么Data就是AVCDecoderConfigurationRecord格式。如果AVCPacketType = 1,那么Data就是H264的NALU(4字节的NALU size+去掉起始码的NALU)。
FLV封装H265和H264的流程是一样的,区别如下:
1、H265的CodecId=12
2、数据格式为HEVCVIDEOPACKET,和AVCVIDEOPACKET结构一样,就是名字不同而已
3、如果 AVCPacketType = 0,那么Data就是HEVCDecoderConfigurationRecord格式,如果AVCPacketType = 1,Data和H264完全一样
关于AVCDecoderConfigurationRecord和HEVCDecoderConfigurationRecord参考我的另外一篇文章:H264/H265的两种格式Annex B、AVCC(H264)/HVCC(H265)_265h,cc-CSDN博客
推荐一个flv库:libflv。实现FLV封装、解封装,纯C语言实现,支持H264/H265、AAC,支持跨平台,也可以用于RTMP音视频Tag Data的生成和解析,地址:https://github.com/BreakingY/libflv