作者:洪洋
原文:https://mp.weixin.qq.com/s/EmS5WfBS61qG4CpKW37PyA
就在上周末,我们见证了一场全球音乐会音乐活动,一个世界在家里一起。整个活动汇聚了大量名人大咖。他们在家里以网络直播的形式向全球观众演唱。其中很多艺人同屏演唱,但这其实是被录制播出的。来自世界各地的上百名歌手,现场设备和网络条件都有差异,实时演唱难度极大。
著名音乐电台DJ、SoundArio音乐基金会创始人加菲尔德说:
几百个歌手,时差、现场录音、网络技术条件都不一样,不可能在线实时协作进行直播,甚至两个人弹唱都不行,因为0.17秒的延时足以抵消世界顶尖音乐人的现场技巧。
这段话的延迟,《为什么》足以抵消世界顶级音乐人的现场技巧。我们举个例子来说明。以宋道祥为例。其钢琴乐谱为4/4拍,标准音乐速度为80拍/分钟。合唱团每小节唱8到12个词,主要由八分音符和十六分音符组成,基本上每个音符对应歌词中的一个词。粗略来说,唱一个词大概需要200-300ms。
在不考虑伴奏的情况下,假设两个歌手A和B之间的端到端延迟为100ms。从声音传播过程来看:
然后a会一直延迟200ms去听B的歌。按照之前唱每个字所花的时间计算,在听感上至少会慢半个字,这是错位的。
如果考虑到伴奏的传递,以及伴奏与演唱的混合,情况就更复杂了。一般只要端到端延迟小于150ms,听者就无法感知。所以,如果你以“稻香”的速度唱一首歌,你可以用小于80 ms的延迟来唱副歌,如果你唱的更快,歌词更密,延迟要求会更低,否则,当你一起唱的时候,两者永远不会在时间上对上,歌手的体验会很糟糕。中国距离美国一万多公里,光速30万km/s,光纤传输会有一些损耗,可以按照20万km/s计算,粗略按照中美之间15000km的物理距离计算,单向延迟约75ms,不可逾越的双向物理延迟约150 ms,而且一个世界的4人合唱现场一起涉及多方合作所以以目前的技术水平,跨超远距离的多方合唱是很难实现的。在《同一个世界》中,我们看到的基本上都是录播。但无论是录音还是实时合唱,给观众带来最好的体验才是最重要的。
在很多社交应用中,都有合唱功能。这是如何工作的?
先解释一下延迟是怎么产生的。该场景中的延迟包括两部分:设备端延迟和端到端延迟。我们需要根据不同阶段的延迟来分析如何减少延迟。
采集和回放终端的音频延迟
图:音视频传输流程
在这里,音频=唱歌,或者说音频=唱歌+伴奏。
设备端的音频延迟也可以细分为以下几点:
此外,合唱场景通常为用户提供各种KTV音效,即语音在编码和传输前会增加一步预处理,这也会增加终端上的音频延迟。
如果想降低音频在终端上的延迟,就需要针对不同的机型优化编解码算法,减少音频采集、编解码、音频处理带来的延迟。终端延迟还与设备性能和系统密切相关。如果其中一个歌手设备性能不好,也会影响合唱效果。
端到服务器延迟
除了终端上的延迟,音频数据从端到服务器、从服务器到服务器的传输也会有较大的延迟,这也是阻碍“实时合唱”功能落地的重要因素。
影响采集终端与服务器之间、服务器与播放终端之间延迟的因素有几个:客户端与服务的物理距离、客户端与服务器的网络运营商、终端网络的网速、负载、网络类型等。如果服务器部署在附近的服务区,并且服务器和客户端的网络运营商相同,那么影响上下游网络延迟的主要因素是终端网络的负载和网络类型。一般来说,在无线网络环境下传输时延波动较大,传输时延通常在5ms ~ 10ms不等,而在有线宽带网络下,同城传输时延可以稳定低至5ms~10ms。而国内中小运营商多,还有一些重叠的网络环境,跨国传输,所以时延会更高。
服务器之间的延迟
这里,我们要考虑两种情况。第一,两端连接到同一个边缘节点,所以作为最优路径,数据通过边缘节点直接转发给播放器;其次,如果采集终端和回放终端不在边缘节点的同一个覆盖区域,那么数据将通过靠近采集终端的边缘节点传输到骨干网,然后发送到靠近回放终端的边缘节点。但是服务器之间的传输和排队也会造成延迟。
在实时合唱的场景下,为了解决网络不畅和网络抖动的问题,需要在采集设备、服务器和播放器处添加缓冲策略。一旦触发缓冲策略,就会有延迟。如果多次堵塞,延迟会慢慢累积。为了解决阻塞问题和累积延迟,需要优化整个网络状况。
歌手都有一个共同的心理需求,就是希望别人夸自己唱得好。在合唱现场,音质尤为重要。影响实时合唱音质的因素主要有:音频采样率、码率和延迟。
采样率:是每秒钟从连续信号中提取的由离散信号组成的样本数。采样率越高,音频声音越接近真实声音。
码率:是指每秒传输编码(压缩)后的音频数据所代表的数据量(比特数)。比特率越高,每秒采样的信息量越大,对这个样本的描述就越准确,音质就越好。
假设网络状态稳定,采样率越高,比特率越高,音质越好,但对应的单次采样信息量越大,传输时间可能越长。换句话说,高音质也可能影响延迟。
我们前面提到过,“音频”因解决方案不同而有不同的含义,这与你的实现逻辑有关。
1.音频=唱歌+伴奏
在采集端,如果我们传输的音频包含演唱和伴奏。那么就是这个逻辑的意思,如下图所示。
在这种传输模式下,如果A要听到合唱效果,会有两个“端到端延迟”,即步骤2和3。因为B听到的是A的演唱和伴奏,这个方案可以保证B的体验。但是因为传送到B and B歌曲的伴奏需要传回给A,所以A听到的伴奏和B的声音之间有很大的延迟。根据上面的延迟推断,你需要付出更多的努力,将端到端的延迟降低到歌手a可以接受的水平。
2.音频=唱歌
在这里,我没有停止陪伴的意思。为了解决伴奏和演唱之间的时间延迟问题,我们还有另外一个方法,就是通过云端把伴奏同时传送给A和B,基本上保证了他们在同一秒内可以听到同一个音符。接下来要解决的只是歌曲的传输。基本实现逻辑如下,这也是我们自己的实现方法:
这种逻辑的好处是,A和B可以几乎同时听到伴奏和唱歌,所以可以实时听到对方的声音。要解决的问题是减少每首歌传输到对方的端到端延迟。相对来说,更简单。
另外,其实我们在线上的场景中可以看到,很多歌手平时唱歌的时候都会戴耳挂,所以这个耳挂的效果在线上的实时场景中也是非常重要的:
(1)歌手是用来监听自己的声音和伴奏,调节音色和情绪的,对延时要求特别高。
(2)通过叠加音效和美声唱法,歌手可以听到更极致的音效。
Agora SDK提供了低延迟k歌耳环功能的统一接口。通过与手机厂商的深度技术合作,可以提供适用于不同手机品牌和型号的k歌和直播app的耳环应用。我们将传统耳环的延迟从100到300毫秒降低到50ms以内,结合整体Agora音频解决方案,实现超低延迟、超低噪音、极致音效的耳环体验。

在github上获取我们的合唱演示,并亲自尝试一下。
https://github.com/AgoraIO-Usecase/Online-Chorus/
我已经对提到的知识点做了一些系统的指导和视频。有需要的朋友可以私信我【NDK】我会分享给你。如有不妥,请指出,交流,共同进步。
NDK模块开发音频和视频开发往往很困难,而这种困难的技术就是NDK的技术。音频/视频/高清大图/人工智能/直播/Tik Tok等今年是离用户最近的一年,和我们生活最相关的技术总是在寻找最终的技术落地平台。以前是windows系统,现在是移动系统,基于Android,所以AndroidNDK技术就成了我们的必备技能。要学好NDK,需要学习C/C++、jni、Linux的基础知识。除此之外,音视频编解码技术、流媒体协议、ffmpeg都是音视频开发的必备技能。








