FLV格式解析

FLV文件由一个flv header和flvbody组成。

FLV header:包含文件标识,头长度,是否存在音频、视频、保留位

FLV body:由PreviousTagSize + Tag组成。ta有三种,分别是Audio tags, Video tags, Data tags

1. Audio Tags (音频标签)

音频标签包含了音频数据,这些数据可以是经过编码的音频流。FLV 支持多种音频编解码器,包括 MP3、Nellymoser、Speex 和 AAC。AAC 是最常用的音频编解码器之一,特别是 AAC 的 LC (Low Complexity) 配置文件。每个音频标签包含以下信息:

AudioTagHeader: 包括音频编码类型、采样率、采样位深、声道类型、包类型

AudioTagBody: 音频数据,可能加密

需要注意的是是对于 AAC 格式的音频数据来说,AudioTagHeader 会多一个字段 AACPacketType 来表示 AACAUDIODATA 的类型:如果 AACPacketType 为 0,那么数据对应的是 AudioSpecificConfig;如果 AACPacketType 为 1,那么数据对应的为 Raw AAC frame data。

这是因为尽管 AudioTagHeader 中有一些基本的音频参数,但它们不足以完全描述 AAC 音频的具体配置。为了正确地解码 AAC 音频,播放器需要使用 AudioSpecificConfig 中的参数来初始化解码器,而不是依赖 AudioTagHeader 中的参数。这是因为 AudioSpecificConfig 提供了更详细和准确的配置信息,这对于 AAC 音频的解码是必要的。

2. Video Tags (视频标签)

视频标签包含了视频帧数据,这些数据可以是经过编码的视频流。FLV 支持多种视频编解码器,包括 H.263 和 H.264/AVC。视频标签包含以下信息:

VideoTagHeader:帧类型,编码类型,包类型、PTS和DTS的差值。

VIDEODATA:视频帧的实际数据

AVCPacketType为0时,意味着接下来的数据包含的是AVCDecoderConfigurationRecord

AVCPacketType为1时,则表示接下来的数据包含一个或多个NAL单元(网络抽象层单元),这些NAL单元构成了完整的帧。

AVCDecoderConfigurationRecord 记录的是 AVC(H.264)解码相关比较重要的 sps 和 pps 信息,解码器在解码数据之前需要首先SPS和 PPS的信息。在做 seek 或者断流重连等操作引起解码器重启时,也需要给解码器再传一遍 SPS和 PPS信息。

在 FLV 的文件中,一般情况下 AVCDecoderConfigurationRecord 只会出现一次,即第一个 Video Tag。

3. Data Tags (数据标签)

数据标签包含了元数据和其他非媒体数据,如脚本数据。这些数据可以用来传递元数据信息,例如视频的标题、作者、版权信息等。此外,数据标签还可以包含用于与 Flash Player 交互的脚本数据

这是一条吃饭博客,由挨踢零声赞助。学C/C++就找挨踢零声,加入挨踢零声,面试不挨踢!

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值