最近把flv格式的封装手撸了一遍,做一下总结。
1、总体结构
FlvHeader
(固定9字节,可以标识是否有音视频)- PreviousTagSize (4字节,第一个PreviousTagSize总为0)
ScriptTag
(onMetaData, 描述视频长宽、音视频解码器等参数)- PreviousTagSize (4字节, ScriptTag具体大小)
AVCSequence
(描述视频信息,存放sps,pps数据)- PreviousTagSize(4字节,AVCSequence具体大小)
AACSequence
(描述音频信息,采样率,声道数等)- PreviousTagSize(4字节,AACSequence具体大小)
VideoTag
(视频数据Tag)- PreviousTagSize(4字节,VideoTag具体大小)
AudioTag
(音频数据Tag)- PreviousTagSize(4字节,AudioTag具体大小)
- …后面重复音视频Tag
2、FlvTag
类型包括ScriptTag、VideoTag、AudioTag、其中AVCSequence是VideoTag的一种
,AACSequence是AudioTag的一种。结构如下:
- FlvTag
- FlvTagHeader (时间戳,Tag类型等)
- FlvTagData (具体数据,如视频的h264的裸流,音频aac裸流�h2)
没错,基本结构就是这样。具体详细细节请参考官方文档
3、一些注意点
- FlvTagHeader中时间戳一共4个字节,前3个字节存放时间戳的低24bit,最后一个字节存放时间戳的高8bit。没错,就是这么坑爹。
- VideoTag的中的CompositionTime字段,填写
CompositionTime = PTS - DTS
数值 - flv里面的时间单位都是毫秒,以大端形式存放数据
- 填充VideoTagData的时候不要带上
nalu
的start code
,AudioTagData不要带上ADTS头
4、参考资料
如果需要自己手撸一份代码,下面资料可以参考