为什么耳朵没怀孕10分钟搞明白直播中杂

《直播疑难杂症排查》系列已经更新了7篇,我们为用户分析了视频直播过程中出现的问题,并一一作出排查。此次我们侧重于直播中的音频,以便给用户带来更好的听觉享受。

继《直播技术详解》系列文章之后,我们推出了这个新的系列《直播疑难杂症排查》,把解决直播问题的经验逐步分享出来,同时也会穿插一些音视频开发的基础知识和优化经验,希望能够帮助到直播领域的开发者们。

本系列会涵盖的内容包括但不限于如下一些主题:

播放失败

直播卡顿

首开慢

延时高

音画不同步

马赛克严重

播放黑屏、花屏、绿屏

播放杂音、噪音、回声

点播拖动不准

直播发热问题

其他问题(待续)

本文为《直播疑难杂症排查》系列的第八篇文章,我们重点看看直播过程中出现的杂音、噪音和回声等问题。

相比于视频而言,音频要敏感得多,视频画面有噪点、马赛克都还是可以勉强被接受,而声音一旦有任何瑕疵,人耳都会特别容易感觉到,而且难以忍受。

问题现象

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

电流音,爆音,滋滋声或者嘟嘟声

声音断断续续,听不清楚

回声,能听到自己说话的声音

问题排查

1.参数配置问题

上面也有提到,音频是一个特别敏感的东西,涉及到许多参数配置,一旦配置不太匹配,就会导致声音听起来非常诡异(比如:采样率是Hz的音频,给播放器配置为Hz或者Hz,就明显会出现音频慢放或者快放的效果)。

常见的音频参数和基本原理,可以参考文章:《Android音频开发(1):基础知识》

我们只需要注意的是,无论是采集和播放,都要给系统的API以及第三方的库配置正确的参数,如:采样率、位宽、声道数等等。

2.代码层面的原因

常见的代码层面的问题有如下几种:

音频buffer大小不匹配,一段bytes的音频,放到了bytes的数组,导致尾部有随机数

音频resample重采样的算法问题,导致采样出来的数据出了问题

Android的ByteBuffer取出数组,是不能直接用.array()方法的,而需要用.get()方法

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

3.网络波动

视频是一帧一帧连续的图像构成的,在播放过程中,如果无法按时渲染,则会出现卡顿的效果;如果丢失几帧画面,则会出现快进效果。

而音频是流式的,虽然也被切分为了一个个音频帧,但如果无法按时播放或者连续丢失较多的音频帧,则会明显听到断断续续的声音出现。特别是在弱网、丢包率高等不稳定网络环境下,很容易出现这种情况。

4.回声消除

回声一般出现在同时有音频的采集和播放的场景,比如:连麦互动、混音返听等等,采集到的音频通过扬声器又播放出来了,同时又被采集了进去,从而产生了回声或者啸叫声。

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

注意:很多Android机型硬件自带的回声消除效果并不是很好。

5.混音越界

音频的PCM数据,通常用short数组来存放,当我们做一些多路音频的混音功能的时候,如果不注意处理short类型的大小越界,则往往带来爆音的问题。下面是一段参考webrtc的混音代码,专门针对混音越界做了简单处理,可以参考参考:

(点击图片,查看活动详情)

预览时标签不可点



转载请注明地址:http://www.duanxua.com/dxzx/5638.html
  • 上一篇文章:
  • 下一篇文章: 没有了
  • 热点文章

    • 没有热点文章

    推荐文章

    • 没有推荐文章