超低延时直播声音编码技术支持 OPUS 编码和 AAC 编码等方式。
WebRTC 标准 Google 参考代码原生支援内建实现;如果需要使用 Opus 编码,首先需要在 SDP 中要有以下定义。
a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc a=fmtp:111 minptime=10;useinbandfec=1
Opus 支持 8000Hz、12000Hz、16000Hz、24000Hz 和 48000Hz 采样率;不同采样率在 SDP 中增加的定义不同,通过修改maxplaybackrate
的参数来定义不同采样率。以 8000Hz 和 16000Hz 的采样率为例。
a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc a=fmtp:111 minptime=10;useinbandfec=1;maxplaybackrate=8000
a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc a=fmtp:111 minptime=10;useinbandfec=1;maxplaybackrate=16000
超低延时直播声音编码技术支持 AAC-LC、AAC-HE 和 AAC-HE2 编解码。
说明
当 AAC 音频的 config 不同时,AAC 编解码不支持 RFC 3640 方式,而 RFC 6416 可以将 config 信息写入 RTP 中。
LATM (Low-overhead MPEG-4 Audio TransportMultiplex,即低开销音频传输复用)是 MPEG-4 AAC 制定的一种高效率的码流传输方式。LATM 格式也以帧为单位,主要由 AudioSpecificConfig(音频特定配置单元)与音频负载组成,可参见附录。
MP4A-LATM 的 RTP 封装格式如下所示。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P|X| CC |M| PT | sequence number |RTP +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | timestamp |Header +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | synchronization source (SSRC) identifier | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | contributing source (CSRC) identifiers | | .... | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | |RTP : audioMuxElement (byte aligned) :Payload | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | :...OPTIONAL RTP padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
RFC 3640 介绍 MP4A-Generic 的 RTP 封装说明(AU_header_size+AU_header+AudioData);音频特定配置可使用带内传输,即每帧都带上;也可使用带外传输,即通过 SDP 传递到解码端。音频负载由若干子帧组成,每个子帧由 PayloadLengthInfo 和 PayloadMux 组成。
LATM 格式以帧为单位,由音频特定配置 StreamMuxConfig 和音频负载 PayloadLengthInfo+PayloadMux 组成。AudioMuxElement 的结构如下图所示。
AudioSpecificConfig 描述了一个 LATM 帧的信息,音频负载主要由负载长度信息 PayloadLengthInfo 和负载净荷 PayloadMux 组成。AudioSpecificConfig 信息可以是带内传,也可以是带外传。
由此可见,AudioSpecificConfig 信息采用带内传输可适应音频编码信息不断变化的情况,而采用带外传输,可以节省音频传输码率。
带内或带外传,由 muxconfigPresent 标志位决定。例如,流媒体应用中,muxconfigPresent 可设置为 0,这样 LATM 帧中将不含 AudioSpecificConfig 信息,LATM 帧通过 RTP 包发送出去,AudioSpecificConfig 可通过 SDP 文件一次性传送到解码端。
... a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc a=fmtp:111 minptime=10;useinbandfec=1 a=rtpmap:120 MP4A-LATM/48000/2 a=rtcp-fb:120 transport-cc a=rtpmap:121 MP4A-LATM/44100/2 a=rtcp-fb:121 transport-cc ...
a=fmtp
带有详细 AAC 信息。
... a=rtpmap:121 MP4A-LATM/44100/2 a=rtcp-fb:121 nack a=rtcp-fb:121 transport-cc a=fmtp:121 SBR-enabled=1;config=40005724101fe0;cpresent=0;object=2;profile-level-id=1 ...
AAC-HE(SBR-enabled=1) 和 AAC-HE2(SBR-enabled=1;PS-enabled=1;) 的 object
的部分取值及含义如下所示。
说明
AAC 有多个采样率时且播放客户端都支持时,优先选择媒体源流的采样率原则。
本节为您介绍阿里云的实现示例。
aac_config:0x1210,则 SDP 应答的a=fmtp
示例如下所示。
a=fmtp:111 cpresent=0;profile-level-id=1;object=2;config=400024203fc0
aac_config:2b920800,则 SDP 应答的a=fmtp
示例如下所示。
a=fmtp:111 cpresent=0;SBR-enabled=1;profile-level-id=1;object=5;config=4000572410003fc0
aac_config:eb8a0800,则 SDP 应答的a=fmtp
示例如下所示。
a=fmtp:111 cpresent=0;SBR-enabled=1;object=29;profile-level-id=1;PS-enabled=1;config=4001d71410003fc0