为什么直播会有回音?

让我们重点关注一下直播过程中的杂音、噪音、回声。

相比视频,音频要敏感得多。视频图像中的噪音和马赛克还是可以勉强接受的,一旦声音有任何瑕疵,就会特别容易让人感觉到,难以忍受。

问题现象

常见的音频问题描述如下:

-电流声、音爆声、河马小厨师声或嘟嘟声。

-我听不清楚。

-艾可,你能听到自己的声音

问题调查

1.参数配置问题

如上所述,音频是一个特别敏感的东西,涉及到很多参数配置。一旦配置不匹配,声音会听起来很奇怪(比如采样率为32000Hz,播放器配置为000Hz或者44100Hz,音频会明显播放缓慢或者快速)。

常用音频参数和基本原理请参考文章:Android音频开发(1):基础知识。

我们只需要注意的是,无论是采集还是回放,系统的API和第三方库都要配置正确的参数,比如采样率、位宽、通道数等等。

2.代码层面的原因

代码级别的常见问题如下:

-音频缓冲区的大小不匹配。一段1024字节的音频放在一个2048字节的数组里,最后产生一个随机数。

-音频重采样算法问题,导致采样数据出现问题。

Android的ByteBuffer取出数组。你不能使用。array()方法,但是您需要使用。get()方法。

-iOS系统,其他app通过系统API改变了AudioSession采样率的配置。

一个接一个的回答

3.网络波动

视频由一帧一帧的连续图像组成。在播放的过程中,如果不能按时渲染,就会有卡顿的效果。如果丢了几帧,就会出现快进效果。

音频是流式的,虽然也分音频帧,但是如果不能按时播放或者连续丢失更多音频帧,就会明显听到断断续续的声音。尤其是在网络弱、丢包率高的不稳定网络环境下,这种情况很容易出现。

4.回波消除

回声通常出现在音频采集和播放同时进行的场景中,例如麦麦互动、混音和听音等。采集到的音频通过扬声器再次播放出来,同时进行采集,产生回声或口哨声。

在这样的场景下,一般需要通过系统的回声消除API或者第三方回声消除库(如speexdsp、webrtc等)来处理。).

注:很多安卓机型的硬件的回声消除效果都不是很好。

5.混合出界

音频的PCM数据通常存储在短数组中。我们在做一些多声道混音功能时,如果不注意短型的大小,往往会带来音爆问题。以下是对webrtc的混合代码的参考,专门用于混合越界的简单处理。