flv格式小结

最近把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的时候不要带上nalustart code,AudioTagData不要带上ADTS头

4、参考资料

如果需要自己手撸一份代码,下面资料可以参考