FLV文件格式

本文详细解读了FLV文件结构,包括flvheader的构成,如版本信息、音频/视频标志位以及tag的组成,如音频数据的格式、视频帧类型和scriptdata的内容。重点介绍了时间戳处理和关键帧的使用。

FLV

​ flv文件格式从整体上看是由flv header 以及flv file body组成。

flv header
PreviousTagSize
Tag 1
PreviousTagSize
Tag n
PreviousTagSize

flv header

FieldTypeComment
SignatureUI8Signature byte always ‘F’ (0x46)
SignatureUI8Signature byte always ‘L’ (0x4C)
SignatureUI8Signature byte always ‘V’ (0x56)
VersionUI8File version (for example, 0x01 for FLV version 1)
TypeFlagsReservedUB[5]Shall be 0
TypeFlagsAudioUB[1]1 = Audio tags are present
TypeFlagsReservedUB[1]Shall be 0
TypeFlagsVideoUB[1]1 = Video tags are present
DataOffsetUI32The length of this header in bytes

​ flv header通常为9个字节,其中前三个字节为文件标志位,分别为’F’、‘L’、‘V’,version字段表示版本号,第五个字节TypeFlags中低0位和低2位分别标志此flv文件video和audio是否存在,最后4个字节表示flv header的长度,version=1时固定为9,其他版本可能存在扩展信息。

flv file body

FieldTypeComment
PreviousTagSize0UI32Always 0
Tag1FLVTAGFirst tag
PreviousTagSize1UI32Size of previous tag, including its header, in bytes.
Tag2FLVTAGSecond tag
PreviousTagSizeNSize of last tag, including its header, in bytes.

​ flv file body是由一系列的tag和previous_tag_size组成,每个tagsize均固定4个字节长度,表示前一个tag长度,在flv version 1中其值应等于固定的tag header长度11个字节 + tag_header_datasize字段的长度。此外,紧跟在flv header后的previous_tag_size的值总是0。

flv tag

universal flv tag

FieldTypeComment
ReservedUB[2]Reserved for FMS, should be 0
FilterUB[1]Indicates if packets are filtered.
Shall be 0 in unencrypted files, and 1 for encrypted tags.
TagTypeUB[5]Type of contents in this tag. The following types are defined:
8 = audio 9 = video 18 = script data
DataSizeUI24Length of the message. Number of bytes after StreamID to end of tag
TimestampUI24Time in milliseconds at which the data in this tag applies.
TimestampExtendedUI8Extension of the Timestamp field to form a SI32 value. upper 8 bits
StreamIDUI24Always 0.
DataData specific for each media type.

FMS: Adobe Flash Media Server

​ tag的一般性定义,根据TagType可以将tag分为三种类型,flv所有的时间信息都应保存在tag header中的时间戳及扩展时间戳,而忽略任何负载中的计时机制,同时通常flv保存的是相对时间戳,相对于第一个tag的时间偏移。

audio data

FieldTypeComment
SoundFormatUB[4]Format of SoundData.
SoundRateUB[2]Sampling rate.
SoundSizeUB[1]Size of each audio sample.
SoundTypeUB[1]Mono or stereo sound
*AACPacketTypeIF SoundFormat == 10
UI8
0 = AAC sequence header
1 = AAC raw
AudioPayLoadVaries by formatEffective voice information

SoundFormat type: 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

音频编码格式,其中最为常用的为10 = AAC,此时tag_data的第二个字节用来表示AACPacketType,用以区

AAC sequence header和AAC raw。AACPacketType == 0时,AudioPayLoad为AudioSpecificConfig;

AACPacketType == 1时,AudioPayLoad为Raw AAC frame data in UI8,一个tag中包含多个 AAV Frame。

SoundRate type : 0 = 5.5 kHz

​ 1 = 11 kHz

​ 2 = 22 kHz

​ 3 = 44 kHz

音频采样率,通常在保证音质的前提下,采样率应为某段音频最高频率的2倍以上。在实际文件中,有时此字段并不代表负载的真实采样率。

SoundSize type : 0 = 8-bit samples 1 = 16-bit samples

SoundType type : 0 = Mono sound 1 = Stereo sound

音频采样值,量化音频信号的区间大小,16bits采样值会比8bits采样值更加细腻,更好的保留声音信息。

video data

FieldTypeComment
Frame TypeUB [4]Type of video frame.
CodecIDUB [4]Codec Identifier.
*AVCPacketTypeIF CodecID == 7
UI8
0 = AVC sequence header
1 = AVC NALU
2 = AVC end of sequence
*CompositionTimeIF CodecID == 7
SI24
IF AVCPacketType ==1 Composition time offset , else 0
VideoPayLoadVaries by formatEffective video information

Frame Type : 1 = key frame (for AVC, a seekable frame)

​ 2 = inter frame (for AVC, a non-seekable frame)

​ 3 = disposable inter frame (H.263 only)

​ 4 = generated key frame (reserved for server use only)

​ 5 = video info/command frame

帧的数据类型,1为关键帧,2为非关键帧,3为h.263非关键帧,4为服务器生成的关键帧,5为视频信息及命令帧

CodecID: 1 = JPEG

​ 2 = Sorenson H.263

​ 3 = Screen video

​ 4 = On2 VP6

​ 5 = On2 VP6 with alpha channel

​ 6 = Screen video version 2

​ 7 = AVC

帧的编码格式,其中最为常用的是7 = AVC ,此时tag_data的第二个字节用来表示AVCPacketType,用以区分AVC sequence heade和AVC NALU,第三到五个字节用来表示CompositionTime,其是PTS相对于DTS的时间偏移。用于存在B帧的情况下,由DTS(flv video tag timestamp)计算出PTS进而进行视频播放。当AVCPacketType=0时,VideoPayLoad为AVCDecoderConfigurationRecord,当AVCPacketType=1时,VideoPayLoad为One or more NALUs (Full frames are required)。

script data

此处不讨论加密模式。通常script data包含两个AMF包,一个name,一个value。

FieldTypeComment
NameSCRIPTDATAVALUEMethod or object name. Type = 2 (String)
ValueSCRIPTDATAVALUEAMF arguments or object properties. Type = 8 (ECMA array)

SCRIPTDATAVALUE的数据组织方式,首先是一个字节的Type,然后根据不同Type,含有不同长度的值。

0 = Number DOUBLE 以小端序组织的8字节double类型。

1 = Boolean UI8 1字节长度,0代表false,1代表true。

2 = String SCRIPTDATASTRING 2字节长度表示字符串长度len,其后的len字节表示字符串(ASCII码)

3 = Object SCRIPTDATAOBJECT 嵌套结构,一系列的{SCRIPTDATASTRING, SCRIPTDATAVALUE}数

​ 据,并以0x00,0x00,0x09为结束码。

7 = Reference UI16 2字节无符号整数

8 = ECMAarray SCRIPTDATAECMAARRAY 同 3 = Object,但最前4个字节表示数组元素数量。

10=Strict array SCRIPTDATASTRICTARRAY 前4个字节表示数组元素数量,紧接着若干个SCRIPTDATAVALUE

11=Date SCRIPTDATADATE DOUBLE表示时间,2字节的有符号整数SI16表示时区偏移

12=Long string SCRIPTDATALONGSTRING 4字节长度表示字符串长度len,其后的len字节表示字符串(ASCII码)

FLV 元数据对象应携带在名为 onMetadata 的 SCRIPTDATA 标签中,可供ActionScript 程序调用其各种属性。

onMetadata

NameTypeComment
durationNumber视频时长(s)
widthNumber以像素为单位的视频宽度
heightNumber以像素为单位的视频高度
videodatarateNumber视频码率
framerateNumber帧率
videocodecidNumber视频解码器ID
audiodatarateNumber音频码率
audiosamplerateNumber音频流的采样率
audiosamplesizeNumber音频采样值大小(量化大小)
stereoBoolean指示立体声音频
audiocodecidNumber音频解码器ID
major_brandString品牌
minor_versionString版本
compatible_brandsString兼容牌品
encoderString编码器
filesizeNumber文件大小(byte)
canSeekToEndBoolean最后一个视频帧是关键帧
keyframesStrict array记录关键帧{文件偏移, 时间戳}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值