音频即时开盘技术分析
分类:网校动态日期:2024-09-04 22:10:46人气:
ALSA(Advanced Linux Sound Architecture)是Linux上主流的音频结构。在ALSA架构出现之前,一直使用OSS(Open Sound System)音频架构。关于OSS的退出和ALSA的出现,可以参见Linux音频驱动-OSS与ALSA声音系统的介绍与比较。
OSS和ALSA音频架构的区别如下:
主要区别在于,OSS架构下,App直接通过Sound设备节点访问底层。 ALSA音频架构下,App通过ALSA提供的alsa-lib库来访问底层硬件操作,不再访问Sound设备节点。这样做的好处是可以简化App实现的难度。
同样,为了兼容OSS,ALSA提供了一个内核模块来模拟OSS声音驱动,因此在OSS架构下编写的应用程序无需修改就可以在ALSA下运行。另外,libaoos库还可以模拟OSS,而不需要OSS相关的内核模块。
音频子系统文件目录结构
音频系统文件位于kernel/sound 下:
root@test:~/k3.18/kernel/sound$ ls
ac97_bus.c atmel firewire Kconfig mips pci sh sound_firmware.c 合成器
aoa 核心i2c Last.c oss PCMCIA soc sparc USB
ARM 驱动程序isa Makefile parisc ppc sound_core.c spi
主要目录介绍信息如下:
一、前言
无论是音频编码还是视频编码,编码和解码都有不同的应用场景。
比较大的应用场景有两个范围:
第一种:文件直播的编解码器;
第二种:用于网络通信的编解码器。
不同的应用场景,编解码器的选择完全不同。比如直播时,不需要考虑长时间的延迟、部分丢包、网络带宽波动等问题,可以充分利用CPU的离线编辑能力。您可以固定I帧的间隔,固定I帧的大小,甚至可以固定多个B帧。码率也可以固定,这对于录制文件和视频来说没有问题。
但如果是用于实时网络通信,恐怕这样就不好了,因为网络是瞬态的,网络状态一般都会伴随着丢包,所以此时不适合使用,比如使用固定的I帧间隔。如果I帧丢失,必须使用I帧重传。此外,您不能使用固定码率,因为码率也是瞬态的。
因此,在用于网络通信的编解码器中,编解码器的选择与用于直播的编解码器的选择有很大不同。例如,有人问网络通信中是否可以进行硬件压缩。事实上,不同的厂商对硬件压缩的支持不同,硬件压缩的迭代不同,编码支持也不同。某些硬件版本无法产生可变的I 帧大小,或者比特率是固定的。如果比特率不固定,硬件编解码器将自动重新启动。我所说的是一些示例,并不意味着所有编解码器都是如此。
我想强调的是,直播和网络通信的编解码器是不同的。今天我要讲的是针对不可靠传输网络的防丢包编解码。
2、防丢包的重要性
首先我们来思考一下防丢包的重要性。
2017年,有几类应用相当流行。大学校园里最火的第一类游戏应该是《王者荣耀》和《狼人杀》。王者荣耀10人组队实时战斗,也有音频,而狼人杀则提供实时视频。第二类是互动直播。主持人向观众发送通讯直播,同时观众可以连接麦克风,实现主播与观众的互动。
记得沪江技术总监吴海滨曾说过,“目前互动在线教育最难解决的问题是实时性,就是师生如何更好地互动”。互动直播对现有网络下的技术提出了更高的要求,要求高质量、低时延的通信质量。在分组交换网络中,为了实现低时延和提高分组质量,如果携带信息的分组不能按时到达,接收质量将不好。
3、移动网络时代丢包现状
既然丢包是低时延、高质量的障碍,那么我们就看一下当前的网络状况是否存在如此多的丢包情况。
当我们提到丢包的时候,我们首先要想到一件事。丢包的定义是什么?
事实上,对于通信来说,丢包并不意味着实际的数据包丢失了。我个人的理解是“只要数据包没有按时到达,就叫丢包”。例如,如果第一个包裹还没有到达,但是第二个包裹已经到达,此时第二个包裹发出去,那么第一个包裹的返回对我来说没有任何帮助,而且实时通讯不能重复。
至于通讯系统,下图是一个基本的通讯系统。 APP通过4G和WIFI进行通信,然后通过公有云进行通信。你可能会想,已经有4G、5G了,带宽是否足够大,不需要考虑丢包的情况了?
不完全是这样。比如我们看一下上图中包裹的到达路径。手机与Pad通信。假设Pad通过4G到达公有云,然后通过WIFI发送回手机。该路径中网络分为三段,即有三段网络可能出现丢包。第一段是公有云之间,因为公有云之间也会有很多路由转换。第二步是4G或者WIFI到APP,第三步是APP和设备本身。
我们先来说第一段。我们会在公有云上搭建一些服务器。即使同一运营商,早8点到晚12点网络状况也不同。至晚上8 点一般来说,晚上8点网络高峰期,此时网络传输非常不稳定。它们之间经常发生丢包。二是不同运营商之间,比如电信和联通之间。中国联通向中国电信传输数据时,由于两家运营商的出口带宽结算问题,即使在高峰时段也可能不稳定。还有一个问题是,对于小型运营商,比如教育网,机房的状态并不总是稳定,可能会出现丢包的情况。
第二段是从4G或者WIFI到终端,不太可靠。如果两个设备连接到不同的基站进行通信,基站之间可能会出现转换和丢包的问题。虽然骨干网连通,但由于骨干网不同运营商的差异,会出现丢包的情况。同一运营商、不同地区之间,网络状况也不同。比如今天的场馆,虽然我觉得这里4G已经不错了,但是当一个2000人的大场馆用联通4G的时候,共享网络的状况其实是比较差的。这就是所谓的共享网络带来的问题。
当我们连接不同国家的互联网时,比如印度、美国,不同国家的网络状况也不同,所以我们在制定网络策略时实际上不能一概而论。
此外,还有WIFI。如果你做过实时通讯的话,你会有一种感觉,有时候4G比WIFI更稳定。因为WIFI实际上是一个非常不稳定的系统。如果在一个公司连接WIFI,公司内可能有几十台路由器,路由器之间会存在频率干扰。另外,即使是几千块钱的路由器最多也只能支持三十、四十人。如果超过此限制,即使已连接,数据包也会主动丢失。因此,并不意味着4G和WIFI的带宽足够高就不会出现丢包的问题。
让我提出一个非常现实的现状。运营商正在推广VoLTE,出现了一个新词,叫VoWiFi。这是数字电话的一场革命,从电路交换过渡到分组交换。在分组交换下,所有通信都是通过分组而不是固定链路来传递的。在之前的通话中,一旦我拨打了这个号码,链接就保持了。不管用没用,用了多少,链接都还存在,所以效果还是比较好的。然而,在分组交换网络中,数据以分组的形式传输。不说话的时候不发包,或者发的包少,码率会比较低。不过运营商很早就提出了VoLTE和VoWiFi。事实上,我们只在少数情况下使用VoLTE。当网络不好的时候,我们会回退到电路交换来进行呼叫。运营商自己的4G网络质量不好,更不用说我们在上面使用的端到端视频通信了。
4. 丢包现象如此普遍,我们可以采取什么解决方案?
既然丢包现象如此普遍,我们可以采取什么解决方案呢?
通常有四种解决方案:FEC、PLC、ARC、ARQ,其中一种是编码器。
ARC和ARQ分别是自动码率控制和自动请求重传。它们都是调整网络状态的策略,但应用场景不同。对于音频来说,无论是语音还是音乐,比特率要求通常都比较低,尤其是语音。此时ARC的应用场景还不是特别大。例如,如果要传输16kbps的语音,在当今的网络条件下并不是什么大问题。传输128kbps音乐有一点问题。如果要传输400-800kbps的视频就会出现更多问题。因此,ARC是一种通过发回数据来估计当前网络状态并主动调整比特率的策略。
ARQ——自动请求重传。当网络延迟比较低的时候,我们可以通过重传来实现防丢包。该解决方案有两种策略:第一种是发送一个数据包,只要在规定时间内没有响应,就发送另一个数据包;第二种是发送一个数据包并等待它的请求,如果它的请求到达,它将是一个重传数据包。但使用该技术的前提是端到端的网络延迟比较短。如果延迟比较长,比如延迟200-400毫秒,采用重传请求方式,网络传输延迟会更长。
PLC是完全后端的防丢包方法,包括最简单的插值方法、过采样方法、以及WebRTC流行的拉伸和缩短方法。这种WebRTC 方法效果不佳,因为延长或缩短会改变声音的频率,可能会产生奇怪的声音,或者会改变语速。插值法采用的策略是第一个数据包到达,第二个数据包丢失,第三个数据包到达,可以通过差值来实现。一般的PLC可以承受5%的丢包,再高就没有效果了。
我要重点讲的是FEC,这是一个很大的话题。 FEC可分为两大类:基于源的和基于通道的。源FEC意味着数据包可以被多次发送。对于音频,每秒可以发送50 个数据包。源FEC发送100个数据包的两倍,相同大小的数据包多发送一次,达到防丢包的目的。基于通道的防丢包就是,比如当前丢包率为25%,我们可以添加50%的防丢包。那么原本有4个数据包,经过处理后,生成了6个数据包。当这6个数据包到达任意4个数据包时,即可实现准确解码。
在源FEC中,如果发送多个数据包,就会出现新的问题。例如,要传输16kpbs的语音。发生丢包时,发送32kpbs语音,同时发送16kpbs。还是分成两个8kpbs再发送?每个都有自己的优点和缺点。如果使用两个8kpb,则降低音质以换取防丢包。如果选择32kpbs并保持音质,如果之前在16kpbs下网络丢包是10%,那么带宽变成32kpbs后丢包情况就不一样了。
因此,Opus 和Silk 编码器提出了一种新方法,使用降低比特率的方法,类似于两个8kbps。在16kbps 音频流中,有4kbps 数据包来补偿前一帧。一旦大包丢失,可以使用小包进行恢复,但问题是音频质量下降。 FEC是一种很好的防丢包方法,但它的问题是可能会浪费带宽。使用FEC后,确实可以提高数据包的到达率,并且可以在有限的延迟的情况下提高通信质量。
如上图所示,我们看一下FEC的流程。先发送了3个报文,从device1向device2发送了3个报文。 Packet2丢失了,所以此时的丢包率为33%。 Device2会向device1发送lossinfo,告诉其丢包率为33%。然后,device1 发送新的数据包。此时,它会发送两个数据包,两个packet4和两个packet5。如果packet4丢失了一个packet,将会由另一个packet4来补偿。
这是一个典型的FEC流程,但是存在几个问题:
丢失信息本身也可能丢失;
丢失信息并没有丢失,但是从设备2到设备1会有延迟;
数据包丢失估计可能不准确。丢包率为33%,如果扩大窗口,丢包率可能达到25%;
虽然抗丢包率达到33%,但只能发送两倍的冗余包,而且没有办法准确发送33%;
仅数据包4 丢失,但数据包5 也发送了两次。这浪费了带宽并且毫无意义。
如果是多方通信,设备2丢包率为33%,但设备3和设备4不丢包怎么办?如果所有设备发送的数据包数量都是原来的两倍,并且比特率没有增加,确实设备2具有更好的抗丢包能力,但牺牲了设备3和设备4的质量。如果码率加倍,所有设备的质量都会提高,但会浪费两倍的带宽。
基于上一节提到的现状以及当前许多学术研究,我们提出了一种新的思路:结合信源编码和信道编码的特点,充分利用分组交换网络的特点。基于此,我们开发了NetXin的语音编解码器——Agora SOLO。从通信原理的角度来看,信源编码是为了追求高压缩比并尽可能消除冗余。信道编码追求强纠错,通过增加冗余来实现纠错。 Agora SOLO将冗余和减冗余结合起来,在不重要的地方减少冗余,在重要的地方增加冗余。
我们以上图为例,来看看Agora SOLO 的防丢包功能。对于所有接收者,我们默认发送这些数据包。但是,我们会将数据包分成两部分,一个是数据包1,另一个是数据包1’。如果只接收到其中一个数据包,则只能实现有限的失真恢复,并且质量相对较差。如果数据包2 和数据包2’ 均被接收,则将这两个数据包组合起来以实现高质量解码。也就是说,Agora SOLO默认不需要等待当前网络丢包状态的统计,只需要直接在编解码器内部实现防丢包即可。
这样做的好处是:
首先,它实现了较低的延迟,因为它不需要估计信道状态,只需直接发送数据包;
二是质量更高。接收1包时,质量达到普通编解码水平,接收2包时,达到高质量编解码水平;
第三,这是针对多人游戏环境的。不同的人下行网络不同,丢包情况也不同;
第四,策略更加简化。使用Agora SOLO时几乎不需要做任何策略调整。
上图是我使用ITU NTT的中文测试序列跑的测试结果。我简单介绍一下。 ITU的NTT是标准编解码器测试序列,有26种语言。我只把中文部分拿出来了。除了荷兰语和俄语之外,中文的编辑难度更大。因为汉语除了普通语言之外还有四个声调。看图片第一列,只收到了8kbps的数据包1。 PESQ的平均分是3.52分。如果只收到packet2,则其得分为3.51分。如果同时收到packet1 和packet2,则在16kbps 时得分为3.95 分。以上是窄带分数。宽带下得分为3.58分,满分为4.5分。这个测试结果可以清楚地看到,当只接收到1个数据包时,失真有限。收到两个包裹后,质量显着提高。
接下来我们将它与其他编码器进行比较。上图是不同编解码器下的中文女声序列对比。第一列是不同丢包率,后面几列是不同编解码器在不同丢包率下的得分。可以看出,当丢包率为25% 时,Agora SOLO 比其他编解码器高1 个百分点。
最后我们回顾一下Agora SOLO 的防丢包功能:
我们可以不再关心网络丢包状态,默认发送两个数据包;
如果只收到一张,就是有限失真,如果收到两张,就是高质量恢复。
附上给大家的音视频学习课程大纲。
上一篇:大数据分析师特训营介绍
下一篇:3分钟“定制”你想要的抖音培训
用户评论
这篇音频开盘技术分析真不错,听完之后对市场有了更清晰的认识。
有18位网友表示赞同!
音频形式的技术分析很有创意,对于忙于工作的人来说太方便了。
有5位网友表示赞同!
之前看不懂开盘技术,这音频分析让我豁然开朗,谢谢分享!
有10位网友表示赞同!
音频即时开盘技术分析?听起来好高大上,我得去听听看。
有6位网友表示赞同!
虽然我不懂技术分析,但这个音频讲解得很清楚,学到了很多。
有10位网友表示赞同!
这音频分析听起来像是老法师在讲,有点枯燥,但内容很丰富。
有17位网友表示赞同!
喜欢这种即时开盘的技术分析,对交易有帮助。
有16位网友表示赞同!
音频质量不错,但感觉分析不够深入,希望能更详细一些。
有5位网友表示赞同!
开盘技术分析对新手来说有点难懂,音频讲解能不能简单点?
有10位网友表示赞同!
听完了音频,感觉对开盘技术有了一个全新的理解,太棒了!
有18位网友表示赞同!
这音频分析听起来像是复制粘贴的,没有新意。
有10位网友表示赞同!
即时开盘技术分析,这个方法是不是真的有效啊?
有8位网友表示赞同!
音频内容不错,但音频里的背景音乐太吵了,影响听感。
有15位网友表示赞同!
听这音频分析,感觉像是在听天书,还是不太懂。
有20位网友表示赞同!
这音频开盘技术分析很实用,适合每天开盘前听一听。
有11位网友表示赞同!
喜欢这种结合音频的技术分析,学起来更轻松。
有14位网友表示赞同!
音频即时开盘技术分析,希望下次能听到更深入的分析内容。
有8位网友表示赞同!
这个音频分析虽然好,但感觉对初学者不太友好,有点难度。
有12位网友表示赞同!