9.3.3. AVB之AVTP

以下内容主要介绍AVB协议族中的音视频传输协议AVTP(IEEE Std 1722-2016)

AVTP是个链路层传输协议,其主要作用有两个:

  • 音视频数据封装: 将音视频数据封装成相应的格式在链路层传输

  • 媒体同步:

    • 媒体时钟同步: 不同的媒体类型有自己的媒体时钟,这些媒体时钟都映射到gPTP时间(同一个时间坐标系),接收端可以轻松进行媒体时钟恢复

    • 播放时间同步: 数据发送时指示接收方在未来的某个时间点播放,如果有多个接收者,他们就会在未来的同一时刻播放

9.3.3.1. 音视频数据封装

AVTP是链路层传输协议,并且是基于VLAN的,在以太网帧中的位置如下:

../../_images/AVTP_ETH.image

针对不同的音视频格式,AVTP有不同的header和payload格式,本文主要基于H264介绍AVTP

9.3.3.1.2. payload结构

AVTP payload结构如下图所示:

../../_images/AVTP_payload.image

h264帧由多个NALU单元组成,如下图所示

../../_images/h264_payload.image

H264帧分为I帧,P帧,B帧三类,其中

  • I帧不存在帧间依赖,可以单独解码成像

  • P帧依赖本帧前面的I帧或P帧(这种依赖是从I帧依次传递过来的,所有中间任何一帧出错都会导致后续帧出错)

  • B帧不仅依赖前面的帧,还依赖后面的帧

如果一个码流只有I帧和P帧,这种码流属于 非交叉式编码模式(Non-interleaved mode) ,帧的解码顺序和显示顺序是一致的.如果码流中包含了B帧, 就成为了 交叉编码模式(Interleaved mode) ,帧的解码顺序和显示顺序就不一定是一致的了.

RTP封装H264数据是以NALU为单位进行的,而不是以帧为单位进行的.RTP打包模式有下面三种:

  • Single NAL unit mode: 单NALU模式,使用H.241

  • Non-interleaved mode: 非交叉模式,NALU的解码顺序和显示顺序是一致的,先解码的NALU先显示

  • Interleaved mode: 交叉模式,本模式下NALU的解码顺序和显示顺序是不一致的,比如有B帧的情况下

RTP打包使用哪种模式,有编码器决定的,不能随便填.

RTP包类型有包含以下几种

  • 单个NALU: 一个数据报文包含一个完整的NALU

  • 聚合多个NALU: 一个数据包文中包含多个NALU,根据这些NALU的时间戳是否相同,又分为下面两种

    • STAP: 一个数据报文包含多个NALU,这些NALU时间戳相同,又分为STAP-A和STAP-B方式

    • MTAP: 一个数据报文包含多个NALU,这些NALU时间戳不同,又分为MTAP16和MTAP24方式

  • 分片方式: NALU太大,无法用一个数据包传输,需要分片,又分为FU-A和FU-B方式

打包模式和包类型之间的关系如下,并不能随便使用

../../_images/package_mode.image

9.3.3.2. 媒体同步

9.3.3.2.1. AVTP Presentation Time

AVTP Presentation time的含义是呈现时间,表示接收方在该时刻需要将AVTP数据包payload中的音视频数据送到应用层进行处理,比如解码播放.

9.3.3.2.2. 播放时间同步

播放时间同步用来指示接收端在某一时刻处理音视频数据,数据可以提前到,但不能迟到.

9.3.3.2.3. 媒体时钟同步

媒体时钟同步解决的是采集速度和播放速度一致的问题(相对时间同步的问题)

视频的媒体时钟一般都是90khz,理想情况下,大家以同样的频率震荡,但是随着时间的流逝或者环境影响,会漂移,这就导致talker和listener的媒体时钟不同步,进而表现为播放不正常

媒体时钟恢复,是指listener根据avtp presentation time重建媒体时钟,使之和采集端保持同步,进而指导音视频以采集时的速率播放,流程如下

  1. 在发送端talker把媒体时钟嵌入在展示时间戳中(采样点对应gPTP的某个时刻)

../../_images/talker_timer.image
  1. 在接收端,媒体时钟从展示时间戳中恢复(AVTP Presentation time和本地gPTP时间对比,二者同步的时刻对应一个Media clock的采样点),进而控制音视频的播放

../../_images/listener_time.image
  1. 媒体时钟回复模块示意图如下

../../_images/media_time_sync.image

9.3.3.2.4. h264_timestamp

AVTP中有了展示时间戳,为什么还要加上h264_timestamp时间戳呢?

在交叉编码模式下,解码顺序和显示顺序是不一致的,如下图所示视频数据是按照Frame0, Frame1的顺序依次采集的,接收端也要按这个顺序显示

../../_images/frame_order.image

但由于存在B帧,编码器实际的输出顺序如下,接收端也要按照下面的顺序解码

../../_images/frame_display_order.image

AVTP Presentation Time的作用是DTS(Decoding Time Stamp),在非交叉模式下,是可以正常工作的.但是在交叉模式下,由于解码顺序和显示顺序不一致,虽然能按正确的顺序 解码,但不能按正确的顺序显示.为了解决这个问题,才加上h264_timestamp