音视频相关的一些基本概念
RTT
TCP中的RTT指的是“往返时延”(Round-Trip Time),即从发送方发送数据开始,到发送方接收到来自接收方的确认消息所经过的时间。
RTT时延通常由三部分决定:链路的传播时间、末端系统的处理时间、路由器等网络中间节点的缓存和排队时间。
正常情况下报文的传输时间和在应用处理时间相对固定,在网络拥堵情况下会出现RTT时延的波动。
RTT是衡量网络传输性能的重要指标之一,能够反映出数据在网络中传输的速度和稳定性。
通常情况下,RTT越短,网络传输的速度就越快,反之则越慢。
因此,通过监测TCP中的RTT时延,可以初步判断网络的性能如何。
但需要注意的是,RTT时延只是一个指标,要全面评估网络性能还需要结合其他指标进行综合分析。
H264
从功能角度分为两层: 视频编码层(VCL)和网络提取层(NAL)
从码流解析的角度: H264 码流实际可以理解为由一个一个的 NALU 单元组成。
视频编码层(VCL)
VCL: 进行视频编解码,包括预测(帧内预测和帧间预测),DCT 变化和量化,熵编码和切分数据等功能,是为了实现更高的视频压缩比。
NAL: 负责以网络所要求的恰当的方式对 VCL 数据进行打包和传送.
VCL工作过程:
- 压缩:预测(帧内预测和帧间预测)-> DCT 变化和量化 -> 比特流编码;
- 切分数据,主要为了第三步。这里一点,网上看到的“切片(slice)”、“宏块(macroblock)”是在VCL 中的概念,一方面提高编码效率和降低误码率、另一方面提高网络传输的灵活性。
- 压缩切分后的 VCL 数据会包装成为 NAL 中的一部分
NAL单元-NALU
NALU分为NAL unit header 和 NAL unit payoad
- NALU header结构
forbidden_zero_bit
在网络传输中发生错误时,会被置为 1,告诉接收方丢掉该单元;否则为 0。
nal_ref_idc
用于表示当前NALU的重要性,值越大,越重要。解码器在解码处理不过来的时候,可以丢掉重要性为 0 的 NALU。 - NALU类型说明
- NALU header 解析举例
00 00 00 01 06: SEI
00 00 00 01 67: 0x67&0x1f = 0x07: SPS
00 00 00 01 65: 0x65&0x1f = 0x05: IDR
- H264分层结构
profile & level
Profile和Level是H.264中一个非常重要的概念,Profile用于确定视频编码过程中帧间压缩使用的算法(例如是否包含B帧、CABAC支持、颜色空间支持等),Profile越高,就说明采用了越高级的压缩特性,对应的对编解码硬件的要求也越高;
Level是对视频本身特性的一些描述(码率,分辨率,fps等),Level越高,视频的码率、分辨率、fps越高。
对于H.264的Profile和Level比较专业化的描述是:Profile@Level,例如[email protected],[email protected],[email protected]。
I帧 vs IDR
举个例子,在一段视频中,
存在以下帧:I P B P B P B B P1 I P2 B…
如果这段视频应用了多重参照帧,那么P2 帧在参照他前面的I 帧的同时,还可能会参照I 帧之前的P1 帧,由于I 帧前后的场景可能会有很大的反差甚至根本不同,所以此时P 帧参考I帧之前的帧不但会没有意义,反而会造成很多问题。
所以一种新型的帧被引入,那就是IDR 帧。如果这段视频应用了多重参考帧的同时采用了IDR 帧,那么帧的顺序就会变成这样:I P B P B P B B P1 IDR P2 B…由于IDR 帧禁止后面的帧向自己前面的帧参照,所以这回P2 帧就不会参照P1 帧了。
MP4 封装格式
Bento4-SDK-1-6-0-639.x86_64-microsoft-win32\bin\mp4dump.exe --verbosity 0 D:\test.mp4 >D:\test.txt
[ftyp] size=8+24
major_brand = mp42
minor_version = 1
compatible_brand = mp42
compatible_brand = mp41
compatible_brand = isom
compatible_brand = avc1
[free] size=8+0
[mdat] size=8+11329609
[moov] size=8+157226
[mvhd] size=12+96
timescale = 1000
duration = 300011
duration(ms) = 300011
[trak] size=8+96887
[tkhd] size=12+80, flags=1
enabled = 1
id = 1
duration = 300000
width = 240.000000
height = 136.000000
[mdia] size=8+96787
[mdhd] size=12+20
timescale = 30000
duration = 8999991
duration(ms) = 299999
language = und
[hdlr] size=12+44
handler_type = vide
handler_name = Test MP4 - Video AVC
[minf] size=8+96691
[vmhd] size=12+8, flags=1
graphics_mode = 0
op_color = 0000,0000,0000
[dinf] size=8+28
[dref] size=12+16, flags=acf9fd
[url ] size=12+0, flags=1
location = [local to file]
[stbl] size=8+96627
[stsd] size=12+135, flags=11e840
entry_count = 1
[avc1] size=8+123
data_reference_index = 1
width = 240
height = 136
compressor =
[avcC] size=8+37
Configuration Version = 1
Profile = Main
Profile Compatibility = 40
Level = 13
NALU Length Size = 4
Sequence Parameter = [67 4d 40 0d 96 62 07 89 fc b0 80 00 00 32 00 00 0b b5 47 8a 14 89]
Picture Parameter = [68 ee 3c 80]
[stts] size=12+12
entry_count = 1
[ctts] size=12+57276
entry_count = 7159
[stss] size=12+868
entry_count = 216
[stsc] size=12+28
entry_count = 2
[stsz] size=12+35972
sample_size = 0
sample_count = 8991
[stco] size=12+2252
entry_count = 562
[trak] size=8+60215
[tkhd] size=12+80, flags=1
enabled = 1
id = 2
duration = 300011
width = 0.000000
height = 0.000000
[mdia] size=8+60115
[mdhd] size=12+20
timescale = 48000
duration = 14400512
duration(ms) = 300010
language = und
[hdlr] size=12+44
handler_type = soun
handler_name = Test MP4 - Audio AAC
[minf] size=8+60019
[smhd] size=12+4
balance = 0
[dinf] size=8+28
[dref] size=12+16, flags=73b98f
[url ] size=12+0, flags=1
location = [local to file]
[stbl] size=8+59959
[stsd] size=12+79, flags=a29ce1
entry_count = 1
[mp4a] size=8+67
data_reference_index = 1
channel_count = 2
sample_size = 16
sample_rate = 48000
[esds] size=12+27
[ESDescriptor] size=2+25
es_id = 0
stream_priority = 0
[DecoderConfig] size=2+17
stream_type = 5
object_type = 64
up_stream = 0
buffer_size = 0
max_bitrate = 0
avg_bitrate = 0
DecoderSpecificInfo = 11 90
[Descriptor:06] size=2+1
[stts] size=12+12
entry_count = 1
[stsc] size=12+28
entry_count = 2
[stsz] size=12+56260
sample_size = 0
sample_count = 14063
[stco] size=12+3520
entry_count = 879
AAC封装格式
AAC(Advance Audio Coding):
即高级音频编码,出现在1997年,基于MPEG-2的音频编码技术,当时被称为MPEG-2 AAC,因此把其作为MPEG-2(MP2)标准的延伸。是由Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,目的是取代MP3格式,随着MPEG-4(MP4)标准在2000年的成型,则为AAC也叫M4A。
AAC格式包括ADIF,ADTS和LATM. 需要说明的是ADIF,ADTS和LATM只是AAC的三种封装方式,只是封装方式不同,编码数据都是一致的。
1:ADIF:只有一个头,其余后面都跟着raw data,文件存储体积小,只能从开始处一帧一帧解码,无法跳播,无法从中间位置解码。
Audio Data Interchange Format 音频数据交换格式,该格式一般应用在将音频通过写文件方式存储在磁盘里的场景,不能进行随机访问,不允许在文件中间开始进行解码;只能从文件头开始解码,无法跳播。
2:ADTS:每帧都有7个字节的头,方便跳播,从任何位置都可以直接进行解码。
ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。这种格式可以用于广播电视。
ADIF只有一个文件头,ADTS每个包前面有一个文件头。
3:LATM:LATM格式具有很大的灵活性,每帧的音频配置单元既可以带内传输,又可以带外传输。正因为如此,LATM不仅适用于流传输还可以用于RTP传输,特别时CMMB广播默认码流格式为LATM。
LATM 的全称为“Low-overhead MPEG-4 Audio TransportMultiplex”(低开销音频传输复用),是MPEG-4 AAC制定的一种高效率的码流传输方式,MPEG-2 TS 流也采用LATM作为AAC 音频码流的封装格式之一。
TS封装格式
TS 全称是 MPEG2-TS,MPEG2-TS 是一种标准容器格式,传输与存储音视频、节目与系统信息协议数据,广泛应用于数字广播系统,我们日常数字机顶盒接收到的就是 TS(Transport Stream,传输流)流。
+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
| TS | = | Packet 1 | Packet 2 | Packet 3 | ... | Packet n-1| Packet n |
+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
TS 传输流中几个基本概念:
- ES (Elementary Stream):基本流,直接从编码器出来的数据流,可以是编码过的音频、视频或其他连续码流;
- PES (Packetized Elementary Streams):PES流是ES流经过打包处理后形成的数据流,在这个过程中完成了将ES流分组、加入包头信息(PTS、DTS 等)操作。PES流的基本单位是PES包,PES包由包头和payload组成;
- PS 流 (Program Stream):节目流,PS 流由 PS 包组成,而一个 PS 包又由若干个 PES 包组成。一个 PS 包由具有同一时间基准的一个或多个 PES 包复合合成;
- TS 流 (Transport Stream):传输流,TS 流由固定长度(188 字节)的 TS 包组成,TS 包是对 PES 包的另一种封装方式,同样由具有同一时间基准的一个或多个 PES 包复合合成。PS 包是不固定长度,而 TS 包为固定长度;
TS 文件分为三层:TS 层、PES 层、ES 层。ES 层就是音视频数据,PES 层是在音视频数据上加了时间戳等数据帧的说明信息,TS层是在PES层上加入了数据流识别和传输的必要信息。
TS 包大小固定为 188 字节,TS 层分为三个部分:TS header、adaptation field、payload;
TS header 固定 4 个字节(0x47开头作为同步字节);
adaptation field 可能存在也可能不存在,主要作用是给不足 188 字节的数据做填充;
payload 是 PES 数据;
One TS Packet:
4bytes xbytes (184-x)bytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TS header | adaptation field | payload(PES) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
One payload(PES):
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| PES header | optional PES header | payload(ES) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
One payload(ES NALU)
Video:
3 or 4 bytes 1byte xbytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| StartCode | NAL header | H264 data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Audio:
7bytes xbytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ADTS header | AAC data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+