找回密码
 立即注册
LiveVideoStack 首页 资讯 查看内容
  • QQ空间
  • 回复
  • 收藏

FFmpeg专栏 | 代码导读——基础篇(四)

2018-4-12 21:21

3.4 Video Tag


如果TAG包中的TagType等于9,表示该Tag中包含的数据类型为Video。StreamID之后的数据就是VideoTagHeader,其定义详见E.4.3.1 VIDEODATA,结构如下:


图8. FLV Video Tag结构


VideoTagHeader之后跟着的就是VIDEODATA数据了,但是和AAC音频一样,它也存在一个特例,就是当视频编码格式为H.264的时候,VideoTagHeader会多出4个字节的信息,AVCPacketType和CompositionTime。


  • AVCPacketType用来表示VIDEODATA的内容

  • CompositonTime相对时间戳,如果AVCPacketType=0x01,为相对时间戳,其它均为0;


以图4. FLV文件结构示例2为例分析VideoTagHeader结构:


1.位置0x0000022C : 0x17, 二进制表示为0001 0111:


  • 高4位为0001,转十进制为1,表示当前帧为关键帧;

  • 低4位为0111,转十进制为7,说明当前视频的编码格式为AVC。


2.位置0x0000022D : 0x00,十进制为0,并且Video的编码格式为AVC,说明VideoTagBody中存放的是AVC sequence header;

3.位置0x0000022E - 0x00000230 : 转十进制为0,表示相对时间戳为0;

4.位置0x00000231 - 0x0000021C : VIDEODATA数据,即AVC sequence header。


3.4.1 AVCDecoderConfigurationRecord


AVC sequence header中存放的是AVCDecoderConfigurationRecord,《ISO-14496-15 AVC file format》对此作了详细定义。它存放的是AVC的编码参数,解码时需设置给解码器后方可正确解码。


通常情况下,AVC sequence header这种Tag在FLV文件中只出现1次,并且是第一个Video Tag。


有关AVCDecoderConfigurationRecord结构的代码解析,可以参考中的ff_isom_write_avcc方法。


3.4.2 CompositionTime(相对时间戳)


相对时间戳的概念需要和PTS、DTS一起理解:


  • DTS : Decode Time Stamp,解码时间戳,用于告知解码器该视频帧的解码时间;

  • PTS : Presentation Time Stamp,显示时间戳,用于告知播放器该视频帧的显示时间;

  • CTS : Composition Time Stamp,相对时间戳,用来表示PTS与DTS的差值。


如果视频里各帧的编码是按输入顺序依次进行的,则解码和显示时间相同,应该是一致的。但在编码后的视频类型中,如果存在B帧,输入顺序和编码顺序并不一致,所以才需要PTS和DTS这两种时间戳。视频帧的解码一定是发生在显示前,所以视频帧的PTS,一定是大于等于DTS的,因此CTS=PTS-DTS。


FLV Video Tag中的TimeStamp,不是PTS,而是DTS,视频帧的PTS需要我们通过DTS + CTS计算得到。


为什么Audio Tag不需要CompositionTime呢?


因为Audio的编码顺序和输入顺序一致,即PTS=DTS,所以它没有CompositionTime的概念。


3.5 Script Data Tags


如果TAG包中的TagType等于18,表示该Tag中包含的数据类型为SCRIPT。


SCRIPTDATA 结构十分复杂,定义了很多格式类型,每个类型对应一种结构,详细可参考E.4.4 Data Tags


onMetaData是SCRIPTDATA中一个非常重要的信息,其结构定义可参考E.5 onMetaData。它通常是FLV文件中的第一个Tag,用来表示当前文件的一些基本信息: 比如视音频的编码类型id、视频的宽和高、文件大小、视频长度、创建日期等。

来自: LiveVideoStack
文章点评