5.音视频基础 FLV

目录

简说FLV

FLV Header

FLV Body

Tag Header

​编辑Tag Data 

Audio Data

Video Data

Script Data 


简说FLV

FLV格式可以包含音频、视频和文本数据,并且可以在网络上进行流媒体传输。优点是文件大小较小,压缩效率高,并且可以在较低的带宽条件下实现较好的视频品质。

FLV的组成部分大致可以说是数据头与数据组成的,如下面导图

FLV Header

Header 部分记录了FLV的类型、版本、流信息、Header 长度等。一般整个Header占用9个字节,大于9个字节则表示头部信息在这基础之上还存在扩展数据。FLV Header 的信息排布如下所示:

前三个字节是固定,第四个字节为版本,然后就是留信息,长度。

 下面就是对Flv视频解析

FLV Body

Body 是由一个个Tag组成的,每个Tag下面有一块4个字节的空间,用来记录这个Tag 的长度。这个后置的PreviousTagSize用于逆向读取处理,表示的是前面的Tag的大小。FLV Body 的信息排布如下:

  1. PreviousTagSize0 总是为0;
  2. tag 由tag header、tag body组成;
  3. 对FLV版本1,tag header固定为11个字节,因此,PreviousTagSize(除第1个)的值为 11 + 前一个tag 的 tag body的大小;

Tag Header

每个Tag 也是由两部分组成的:Tag Header 和 Tag Data。Tag Header 存放了当前Tag的类型,数据长度、时间戳、时间戳扩展、StreamsID等信息,然后再接着数据区Tag Data。Tag的排布如下:第一个tag的Timestamp为0

Tag Data 

分成 Audio,Video,Script 三种。

Audio Data

音频的Tag Data又分为 AudioTagHeader (1个字节)和 Data 数据区,其排布结构如下图所示:

字段类型字段含义
SoundFormatUB[4]音频格式,重点关注 **10 = AAC **
0 = Linear PCM, platform endian
1 = ADPCM
2 = MP3
3 = Linear PCM, little endian
4 = Nellymoser 16-kHz mono
5 = Nellymoser 8-kHz mono
6 = Nellymoser
7 = G.711 A-law logarithmic PCM 8 = G.711 mu-law logarithmic PCM 9 = reserved
10 = AAC
11 = Speex
14 = MP3 8-Khz
15 = Device-specific sound
SoundRateUB[2]采样率,对AAC来说,永远等于3
0 = 5.5-kHz
1 = 11-kHz
2 = 22-kHz
3 = 44-kHz
SoundSizeUB[1]采样精度,对于压缩过的音频,永远是16位
0 = snd8Bit
1 = snd16Bit
SoundTypeUB[1]声道类型,对Nellymoser来说,永远是单声道;对AAC来说,永远是双声道;
0 = sndMono 单声道
1 = sndStereo 双声道
SoundDataUI8[size of sound data]如果是AAC,则为 AACAUDIODATA;
其他请参考规范;

当 SoundFormat 为10时,表示音频采AAC进行编码,此时,SoundData的定义如下:

字段字段类型字段含义
AACPacketTypeUI80: AAC sequence header
1: AAC raw
DataUI8[n]如果AACPacketType为0,则为AudioSpecificConfig
如果AACPacketType为1,则为AAC帧数据

Video Data

Video Tag 由一个字节的VideoTagHeader 和 Video数据区部分组成

字段字段类型字段含义
FrameTypeUB[4]重点关注1、2:
1: keyframe (for AVC, a seekable frame) —— 即H.264的IDR帧;
2: inter frame (for AVC, a non- seekable frame) —— H.264的普通I帧;
3: disposable inter frame (H.263 only)
4: generated keyframe (reserved for server use only)
5: video info/command frame
CodecIDUB[4]编解码器,主要关注 7(AVC)
1: JPEG (currently unused)
2: Sorenson H.263
3: Screen video
4: On2 VP6
5: On2 VP6 with alpha channel 6: Screen video version 2
7: AVC
VideoData取决于CodecID实际的媒体类型,主要关注 7:AVCVIDEOPACKE
2: H263VIDEOPACKET
3: SCREENVIDEOPACKET
4: VP6FLVVIDEOPACKET
5: VP6FLVALPHAVIDEOPACKET
6: SCREENV2VIDEOPACKET
7: AVCVIDEOPACKE

AVCVIDEOPACKE

当 CodecID 为 7 时,VideoData 为 AVCVIDEOPACKE,也即 H.264媒体数据。

AVCVIDEOPACKE 的定义如下:

字段字段类型字段含义
AVCPacketTypeUI80: AVC sequence header
1: AVC NALU
2: AVC end of sequence
CompositionTimeSI24如果AVCPacketType=1,则为时间cts偏移量;否则,为0
DataUI8[n]1、如果如果AVCPacketType=1,则为AVCDecoderConfigurationRecord
2、如果AVCPacketType=1=2,则为NALU(一个或多个)
3、如果AVCPacketType=2,则为空

这里有几点稍微解释下:

  1. NALU:H.264中,将数据按照特定规则格式化后得到的抽象逻辑单元,称为NALU。这里的数据既包括了编码后的视频数据,也包括视频解码需要用到的参数集(PPS、SPS)。
  2. AVCDecoderConfigurationRecord:H.264 视频解码所需要的参数集(SPS、PPS)
  3. CTS:当B帧的存在时,视频解码呈现过程中,dts、pts可能不同,cts的计算公式为 pts - dts/90,单位为毫秒;如果B帧不存在,则cts固定为0;

PPS、SPS这里先不展开。

Script Data 

是 flv 的第一个 Tag,跟在 flv header 后,用于存放 flv 视频和音频的元信息,比如 duration、audiodatarate、creator、width 等。一般来说,Script Tag Data结构包含两个 AMF 包(AMF(Action Message Format)是 Adobe 设计的一种通用数据封装格式,第一个AMF包封装字符串类型数据,第二个AMF包封装一个数组类型。在 Adobe 的很多产品中应用,简单来说,AMF 将不同类型的数据用统一的格式来描述)。

通常用来存放跟FLV中音视频相关的元数据信息

上图为第一个AMF包

  • type=0x02对应String
  • size=0A=10
  • value=onMetaData 正好是10个字节

 上图为第二个AMF

  • type=0x08 对应ECMA array type。

表示数组,类似Map。后面4个字节为数组的个数。然后是键值对,第一个为键,2个字节为长度。后面跟具体的内容。接着1个字节表示值的类型,然后根据类型判断长度。
上图我们可以判断,总共有13个键值对。

  • 第一个长度为8个字节是duration。值类型是0x004073,第一个字节是00,所以是double,8个字节4073A7851EB851EC,通过计算Double.longBitsToDouble(0x4073A7851EB851ECL)得到314.47与视频信息里一致 00:05:14.47。
  • 第二个长度5个字节是width。值也是double类型,8个字节。
    依次解析下去...
  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路奇怪

有钱出钱,没钱多出编程主意啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值