[本系列相关文章]

  • H264和音频流打包成PS流 (MPEG2-PS)
  • PS流解复用成H264和音频流(ES提取)
  • H264和音频流打包成TS流 (MPEG2-TS)
  • TS流解复用成H264和音频流(ES提取)
  • FLV文件格式基础
  • 解复用FLV文件(基于FFMPEG解析FLV(h264+aac))
  • 解复用FLV文件(不用FFMPEG,C++实现)

FLV,F4V,MP4广泛应用于各主流直播和点播平台,能够非常方便的流媒体和存储处理。本篇记录一下FLV文件的格式学习,FLV相对MP4格式比较简单。主要由文件头+三种类型的TAG组成。FLV支持的音视频编解码方式如下图

FLV文件格式基础_ffmpeg

FLV总体结构如下图 

FLV文件格式基础_音频流_02

文件头



 

Field

Data Type

Default

Details

Signature

byte[3]

“FLV”

Always “FLV”

Version

uint8

1

Only 0x01 is valid

Flags

uint8 bitmask

0x05

Bitmask: 0x04 is audio, 0x01 is video (so 0x05 is audio+video)

Header Size

uint32_be

9

Used to skip a newer expanded header



文件主体

交替有前面tag长度和tag体组成,

FLV文件格式基础_音频流_03

TAG头

FLV文件格式基础_复用_04

AUDIODATA格式

 

FLV文件格式基础_ffmpeg_05

 如果是MP3等其他数据,直接拷贝音频数据,AAC格式如下

FLV文件格式基础_ffmpeg_06

VIDEODATA数据如下

FLV文件格式基础_复用_07

H264/AVC编码时 AVCVIDEOPACKET

FLV文件格式基础_音频流_08

注意一下:

  1. flv文件中Timestamp和TimestampExtended拼出来的是dts,相对于第一个TAG来说的毫秒数。
  2. CompositionTime 表示当前帧PTS对DTS的偏移值,单位毫秒即CTS=PTS-DTS。CTS永远>0,因为一帧显示时间总是在解码时间之后。如

帧类型

I

B

B

P

显示序号

1

2

3

4

解码序号

1

3

4

2

PTS

0

40ms

80ms

120ms

DTS

0

20ms

50ms

10ms

第一个B帧40ms需要显示,所以40ms以前必须解码好,而第一个B帧要解码需要依赖P帧,所以在40ms以前P帧和第一个B帧都要解码好。 

  1.  如果H264编码中没有B真,则PTS==DTS,所以CompositionTime CTS==0。
  2. AudioSpecificConfig参考ISO 14496-3,AVCDecoderConfigurationRecord参考ISO 14496-15。
  3. Data tags在本篇没解析,基本由AMF1和AMF2组成,包括视频分辨率,比特率,帧率,时长,大小,采样率,通道数常用信息。
     
     
     



技术在于交流、沟通,转载请注明出处并保持作品的完整性。

[本系列相关文章]

  • H264和音频流打包成PS流 (MPEG2-PS)
  • PS流解复用成H264和音频流(ES提取)
  • H264和音频流打包成TS流 (MPEG2-TS)
  • TS流解复用成H264和音频流(ES提取)
  • FLV文件格式基础
  • 解复用FLV文件(基于FFMPEG解析FLV(h264+aac))
  • 解复用FLV文件(不用FFMPEG,C++实现)

FLV,F4V,MP4广泛应用于各主流直播和点播平台,能够非常方便的流媒体和存储处理。本篇记录一下FLV文件的格式学习,FLV相对MP4格式比较简单。主要由文件头+三种类型的TAG组成。FLV支持的音视频编解码方式如下图

FLV文件格式基础_ffmpeg

FLV总体结构如下图 

FLV文件格式基础_音频流_02

文件头



 

Field

Data Type

Default

Details

Signature

byte[3]

“FLV”

Always “FLV”

Version

uint8

1

Only 0x01 is valid

Flags

uint8 bitmask

0x05

Bitmask: 0x04 is audio, 0x01 is video (so 0x05 is audio+video)

Header Size

uint32_be

9

Used to skip a newer expanded header



文件主体

交替有前面tag长度和tag体组成,

FLV文件格式基础_音频流_03

TAG头

FLV文件格式基础_复用_04

AUDIODATA格式

 

FLV文件格式基础_ffmpeg_05

 如果是MP3等其他数据,直接拷贝音频数据,AAC格式如下

FLV文件格式基础_ffmpeg_06

VIDEODATA数据如下

FLV文件格式基础_复用_07

H264/AVC编码时 AVCVIDEOPACKET

FLV文件格式基础_音频流_08

注意一下:

  1. flv文件中Timestamp和TimestampExtended拼出来的是dts,相对于第一个TAG来说的毫秒数。
  2. CompositionTime 表示当前帧PTS对DTS的偏移值,单位毫秒即CTS=PTS-DTS。CTS永远>0,因为一帧显示时间总是在解码时间之后。如

帧类型

I

B

B

P

显示序号

1

2

3

4

解码序号

1

3

4

2

PTS

0

40ms

80ms

120ms

DTS

0

20ms

50ms

10ms

第一个B帧40ms需要显示,所以40ms以前必须解码好,而第一个B帧要解码需要依赖P帧,所以在40ms以前P帧和第一个B帧都要解码好。 

  1.  如果H264编码中没有B真,则PTS==DTS,所以CompositionTime CTS==0。
  2. AudioSpecificConfig参考ISO 14496-3,AVCDecoderConfigurationRecord参考ISO 14496-15。
  3. Data tags在本篇没解析,基本由AMF1和AMF2组成,包括视频分辨率,比特率,帧率,时长,大小,采样率,通道数常用信息。