0%

live_flv

flv简介

flv是一种视频容器格式,用于封装特定类型编码方式的音频和视频,并以tag的方式封装。特定格式是协议限制。若传输涉及的端闭环,实现上也可以支持
其他编码方式的音视频,因为flv并不要求,且tag的方式灵活。

flv 老协议了,是很久前adobe开发的,但是因为国内很多厂商还在用,所以也还得了解。
f4v相对较新,支持h264,h265,不过一般也叫flv了,音频可以是aac或MP3
现在稍微过时了,用h5的多些;

flv协议

见附件,可能老一点,但是总体格式不变
video_file_format_spec_v10下载

flv中视频的封装

一般视频的第一个tag封装的是metadata,接着是视频头和音频头的格式封装,比如视频是 AVC seqence header,放置pps,sps,sei等信息;之后是视频音频tag是实际数据
如视频可能是 NALU,音频可能是aac raw data;

flv中视频头的封装

来看一个例子:
视频头:

视频数据:

可以看到avc header的一般格式;
字段解释:
从文档:H.264-AVC-ISO_IEC_14496-15.pdf
H.264-AVC-ISO_IEC_14496-15.pdf 下载
可以看到如下定义: 即avc sequence header定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
aligned(8) class AVCDecoderConfigurationRecord {
unsigned int(8) configurationVersion = 1;
unsigned int(8) AVCProfileIndication;
unsigned int(8) profile_compatibility;
unsigned int(8) AVCLevelIndication;
bit(6) reserved = ‘111111’b;
unsigned int(2) lengthSizeMinusOne;
bit(3) reserved = ‘111’b;
unsigned int(5) numOfSequenceParameterSets;
for (i=0; i< numOfSequenceParameterSets; i++) {
unsigned int(16) sequenceParameterSetLength ;
bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit;
}
unsigned int(8) numOfPictureParameterSets;
for (i=0; i< numOfPictureParameterSets; i++) {
unsigned int(16) pictureParameterSetLength;
bit(8*pictureParameterSetLength) pictureParameterSetNALUnit;
}
if( profile_idc == 100 || profile_idc == 110 ||
profile_idc == 122 || profile_idc == 144 )
{
bit(6) reserved = ‘111111’b;
unsigned int(2) chroma_format;
bit(5) reserved = ‘11111’b;
unsigned int(3) bit_depth_luma_minus8;
bit(5) reserved = ‘11111’b;
unsigned int(3) bit_depth_chroma_minus8;
unsigned int(8) numOfSequenceParameterSetExt;
for (i=0; i< numOfSequenceParameterSetExt; i++) {
unsigned int(16) sequenceParameterSetExtLength;
bit(8*sequenceParameterSetExtLength) sequenceParameterSetExtNALUnit;
}
}
}

语意:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
AVCProfileIndication contains the profile code as defined in ISO/IEC 14496-10.
profile_compatibility is a byte defined exactly the same as the byte which occurs between the
profile_IDC and level_IDC in a sequence parameter set (SPS), as defined in ISO/IEC 14496-10.
AVCLevelIndication contains the level code as defined in ISO/IEC 14496-10.
lengthSizeMinusOne indicates the length in bytes of the NALUnitLength field in an AVC video
sample or AVC parameter set sample of the associated stream minus one. For example, a size of one
byte is indicated with a value of 0. The value of this field shall be one of 0, 1, or 3 corresponding to a
length encoded with 1, 2, or 4 bytes, respectively.
numOfSequenceParameterSets indicates the number of SPSs that are used as the initial set of SPSs
for decoding the AVC elementary stream.
sequenceParameterSetLength indicates the length in bytes of the SPS NAL unit as defined in
ISO/IEC 14496-10.
sequenceParameterSetNALUnit contains a SPS NAL unit, as specified in ISO/IEC 14496-10. SPSs
shall occur in order of ascending parameter set identifier with gaps being allowed.
numOfPictureParameterSets indicates the number of picture parameter sets (PPSs) that are used
as the initial set of PPSs for decoding the AVC elementary stream.
pictureParameterSetLength indicates the length in bytes of the PPS NAL unit as defined in
ISO/IEC 14496-10
pictureParameterSetNALUnit contains a PPS NAL unit, as specified in ISO/IEC 14496-10. PPSs
shall occur in order of ascending parameter set identifier with gaps being allowed.
chroma_format contains the chroma_format indicator as defined by the chroma_format_idc parameter
in ISO/IEC 14496-10.
bit_depth_luma_minus8 indicates the bit depth of the samples in the Luma arrays. For example, a bit
depth of 8 is indicated with a value of zero (BitDepth = 8 + bit_depth_luma_minus8). The value of this
field shall be in the range of 0 to 4, inclusive.
bit_depth_chroma_minus8 indicates the bit depth of the samples in the Chroma arrays. For example,
a bit depth of 8 is indicated with a value of zero (BitDepth = 8 + bit_depth_luma_minus8). The value of
this field shall be in the range of 0 to 4, inclusive.
numOfSequenceParameterSetExt indicates the number of Sequence Parameter Set Extensions that
are used for decoding the AVC elementary stream.
sequenceParameterSetExtLength indicates the length in bytes of the SPS Extension NAL unit as
defined in ISO/IEC 14496-10.
sequenceParameterSetExtNALUnit contains a SPS Extension NAL unit, as specified in
ISO/IEC 14496-10.
flv中原始数据的封装:

是基于avcc封装的,即nalu长度+nalu单元。具体:
ISO/IEC14496-15

flv中音频的封装

flv的音频tag和视频类似:
由11B flv tag+2B audiotagheader+audiodata+ pretagsize(4B)组成;
其中第一个音频帧audiodata是aac sequence header(一般叫audiospecificconfig),之后的是aac raw原始数据;
音频头:

音频数据

ISO/IEC 14496-3 aac 头定义的地方;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

这块的资料比较少,基本都是按GAPSepcific来,
AudioSpecificConfig(5个字节)
字段 占位
audioObjectType 5 table1.1有见协议
samplingFrequencyIndex 4 见下table1.18
channelConfiguration 4 值见Table 1.19
frameLengthFlag 1 解释见下
dependsOnCoreCoder 1 解释见下:
extensionFlag 1 见下

reff:
Table 1.15 – Syntax of AudioSpecificConfig()

Syntax No. of bits Mnemonic
AudioSpecificConfig ()
{
audioObjectType = GetAudioObjectType();
。。。

ISO14496-3-2009.pdf 下载

flv中的cts,dts,pts

flv在流媒体中的运用:

在流媒体直播中也经常用flv传输:
参考例子:
视频,每个I帧中塞入需要解码的头,avc header
音频:如每个音频都放aac header.

other ref:

MPEG-4分部
MPEG-4由一系列的子标准组成,被称为部(part)(有时也译为卷),包括以下的部分:

第一部分(ISO/IEC 14496-1):系统:描述视频和音频数据流的控制、同步以及混合方式(即混流Multiplexing,简写为MUX)。
第二部分(ISO/IEC 14496-2):视频:定义一个对各种视觉信息(包括自然视频、静止纹理、计算机合成图形等等)的编解码器。(例如XviD编码就属于MPEG-4 Part 2)
第三部分(ISO/IEC 14496-3):音频:定义一个对各种音频信号进行编码的编解码器的集合。包括高级音频编码(Advanced Audio Coding,缩写为AAC)的若干变形和其他一些音频/语音编码工具。
第四部分(ISO/IEC 14496-4):一致性:定义对本标准其他的部分进行一致性测试的程序。
第五部分(ISO/IEC 14496-5):参考软件:提供用于演示功能和说明本标准其他部分功能的软件。
第六部分(ISO/IEC 14496-6):多媒体传输集成框架(DMIF for Delivery Multimedia Integration Framework)
第七部分(ISO/IEC 14496-7):优化的参考软件:提供对实现进行优化的例子(这里的实现指的是第五部分)。
第八部分(ISO/IEC 14496-8):在IP网络上传输:定义在IP网络上传输MPEG-4内容的方式。
第九部分(ISO/IEC 14496-9):参考硬件:提供用于演示怎样在硬件上实现本标准其他部分功能的硬件设计方案。
第十部分(ISO/IEC 14496-10):高级视频编码或称高级视频编码(Advanced Video Coding,缩写为AVC):定义一个视频编解码器(codec)。AVC和XviD都属于MPEG-4编码,但由于AVC属于MPEG-4 Part 10,在技术特性上比属于MPEG-4 Part2的XviD要先进。另外,它和ITU-T H.264标准是一致的,故又称为H.264。
第十二部分(ISO/IEC 14496-12):基于ISO的媒体文件格式:定义一个存储媒体内容的文件格式。
第十三部分(ISO/IEC 14496-13):知识产权管理和保护(IPMP for Intellectual Property Management and Protection)拓展。
第十四部分(ISO/IEC 14496-14):MPEG-4(即MP4)文件格式:定义基于第十二部分的用于存储MPEG-4内容的视频文档格式。
第十五部分(ISO/IEC 14496-15):AVC文件格式:定义基于第十二部分的用于存储第十部分的视频内容的文件格式。
第十六部分(ISO/IEC 14496-16):动画框架扩展(AFX : Animation Framework eXtension)。
第十七部分(ISO/IEC 14496-17):同步文本字幕格式。
第十八部分(ISO/IEC 14496-18):字体压缩和流式传输(针对开放字体格式Open Font Format)。
第十九部分(ISO/IEC 14496-19):合成材质流(Synthesized Texture Stream)。
第二十部分(ISO/IEC 14496-20):简单场景表示(LASeR for Lightweight Scene Representation。
第二十一部分(ISO/IEC 14496-21):用于描绘(Rendering)的MPEG-J拓展。
第二十二部分(ISO/IEC 14496-22):开放字体格式(Open Font Format)。
第二十三部分(ISO/IEC 14496-23):符号化音乐表示(Symbolic Music Representation)。
第二十四部分(ISO/IEC 14496-24):音频与系统交互作用(Audio and systems interaction)。
第二十五部分(ISO/IEC 14496-25):3D图形压缩模型(3D Graphics Compression Model)。
第二十六部分(ISO/IEC 14496-26):音频一致性检查:定义测试音频数据与ISO/IEC 14496-3是否一致的方法(Audio conformance)。
第二十七部分(ISO/IEC 14496-27):3D图形一致性检查:定义测试3D图形数据与ISO/IEC 14496-11:2005, ISO/IEC 14496-16:2006, ISO/IEC 14496-21:2006,和ISO/IEC 14496-25:2009是否一致的方法(3D Graphics conformance)。