UP主们快速上热门(推荐)的助推资源-(点此进入)
代码层面的原因,常见的代码层面的问题有如下几种,音频 buffer 大小不匹配,一段 1024 bytes 的音频,放到了 2048 bytes 的数组,导致尾部有随机数, 音频 resample 重采样的算法问题,导致采样出来的数据出了问题 ,Android 的ByteBuffer 取出数组,是不能直接用 .array() 方法的,而需要用 .get() 方法 iOS 系统,其他 app 通过系统 API 更改了 AudioSession 采样率的配置。
网络波动,视频是一帧一帧连续的图像构成的,在播放过程中,如果无法按时渲染,则会出现卡顿的效果;如果丢失几帧画面,则会出现快进效果。而音频是流式的,虽然也被切分为了一个个音频帧,但如果无法按时播放或者连续丢失较多的音频帧,则会明显听到断断续续的声音出现。特别是在弱网、丢包率高等不稳定网络环境下,很容易出现这种情况。B站新手/老手必备上热门必备资源-(点此了解)
回声消除,回声一般出现在同时有音频的采集和播放的场景,比如:连麦互动、混音返听等等,采集到的音频通过扬声器又播放出来了,同时又被采集了进去,从而产生了回声或者啸叫声。这样的场景下,一般需要通过系统的回声消除 API,或者第三方回声消除库(如:speexdsp,webrtc 等)进行处理。注意:很多 Android 机型硬件自带的回声消除效果并不是很好。
混音越界,音频的 PCM 数据,通常用 short 数组来存放,当我们做一些多路音频的混音功能的时候,如果不注意处理 short 类型的大小越界,则往往带来爆音的问题。下面是一段参考 webrtc 的混音代码,专门针对混音越界做了简单处理。