关于直播:如何解决移动直播下的耳返延迟问题

117次阅读

共计 2327 个字符,预计需要花费 6 分钟才能阅读完成。

​​耳返是主持人或歌手在一些大型晚会现场会佩戴的一种电子设备。耳返其实是“应用耳机模式的返送”,它是包含耳机、无线接收器、无线发射器,混音器等一系列设施的总称,与之比照的是“地返”,是指装在舞台后方固定的用来返送的音响。

对于歌手而言,上演现场往往是个很大的空间,会有声音的提早或变质,当歌手在现场演唱时往往听不到本人的声音,或者听到伴奏时已产生提早,所以须要耳返把伴奏送到歌手耳边以保障他们不会唱错拍子或走音走调。

耳返存在的问题

通过后面的介绍咱们理解到,耳返的应用对延时性要求比拟高,如果延时大于 30ms,人听到的耳返声音就会有“错位”的感觉,如果大于 50ms 就会显著感觉到提早的存在。随着提早的一直增大,对于演奏者来说,岂但不能很好的通过耳返来及时调整演奏的节奏,甚至还会影响演奏的整体成果。

如上图,耳返延时也就是声音在设施上的往返提早: 音频信号进入挪动设施的输出组件,由利用处理器上运行的利用进行解决,而后从输入组件传出,这整个过程所破费的工夫就是声音的残缺往返工夫。影响耳机的往返提早次要体现在以下几方面:

1. 挪动设施中应用的扬声器和麦克风因为设施类型多样及品质参差不齐,在有些设施上通常音效较差,所以会通过减少信号处理性能来改善音质。此类信号处理会引起提早。

2. 对于同步输出和输入,每一侧将应用独自的缓冲区队列实现处理程序。即便两侧采纳雷同的采样率,也无奈保障这些回调的绝对程序或音频时钟的同步。利用该当缓存数据,并适当进行缓冲区同步,应用的数据缓存会引起提早。

3. 在音频处理过程中因为音频采集和播放的采样率不对立或其余解决起因而进行的采样率转换,也会造成提早。

4. 数据第一次在缓冲区退出队列后启动音频管道所需工夫的长短也会产生不同的提早。

挪动端对声音耳返的解决中,iOS 的体现显著优于 Android。Android 端提早的问题次要体现在: 零碎 API 在不同机型上提早体现存在多样性,有些机型甚至会达到 300ms 的提早,这样齐全不能满足耳返的性能需要。

耳返实现的形式

1. 通过 Android 提供零碎 API 进行声音的采集和播放,其特点是应用简略。但因为是 Java 层的 API,无论是播放还是采集都须要将数据在 Java 层和 Native 层之间拷贝,影响性能且提早较大。不同型号设施间,因为厂商对系统层不同的批改也会导致声音提早体现差异较大,范畴大抵在 150ms-300ms 之间。

在 Android 设施上运行时,并不能确定通过任何门路的音频延迟时间,不过咱们能够通过对下列硬件性能标记,来理解硬件设施是否能为延迟时间提供保障。

2.android.hardware.audio.low_latency 批示 45ms 或更短的继续输入延迟时间。

3.android.hardware.audio.pro 批示 20ms 或更短的继续往返延迟时间。

能够通过如下代码检测:

为了最大限度的缩短延迟时间,咱们须要获取与设施最佳匹配的采样率和缓冲数据大小。

以下代码能够从 AudioManager 获得最佳采样率:

以下代码能够从 AudioManager 获取采纳与获得最佳采样率类似的形式获得最佳缓冲区大小。PROPERTY_OUTPUT_FRAMES_PER_BUFFER 属性示意 HAL(硬件形象层)缓冲区能够包容的音频帧数。如果应用正确数量的音频帧,会定期呈现回调,而这将缩小抖动。在不同的设施及不同的 Android build 中,HAL 缓冲区大小有所不同。

以上确定好设施的音频采集播放的最佳参数后,咱们就能够实现音频的采集和播放性能了。在 Android 零碎 API 中能够通过创立 AudioRecorder 和 AudioTrack 类实例来实现设施端的音频采集和音频播放。

​2. 通过 openSL ES,实现简单,提早较小,而且有可控的提早 buffer 可调。不论是编写合成器、卡拉 OK、游戏还是其余实时利用,都能够应用 C 或 C++ 实现高性能、低延迟时间音频。而且 Android 在 O 版本中引入 AAudio 作为 OpenSL ES 库的轻量级原生 Android 代替项,专门针对低延时高性能的音频利用设计,实现起来绝对 openSL ES 要简略许多,性能上也会绝对更优。

对于申明 android.hardware.audio.low_latency 性能的设施, 也能够通过后面的办法获取设施的最佳采样率、缓冲区,利用与 OpenSL ES 中,已实现设施上更短的延迟时间。

opengGL 的创立流程:

a. 创建对象 (通过带有 create 的函数)

b. 初始化 (通过 Realize 函数)

c. 获取接口来应用相干性能 (通过 GetInterface 函数)

3. 个别厂商提供的耳返接口: 有些手机厂商优化零碎底层逻辑,针对 Android 零碎的音频耳返性能优化出最现实的成果,如: 华为、vivo、oppo 会有厂商提供的专门的耳返 API 调用,这种形式实现的耳返成果提早绝对最优。

为了针对不同 Android 手机实现最优的提早成果,融云采纳厂商 + openSL ES + 零碎 API 的形式联结实际。当手机反对厂商提供耳返 API 时,融云音视频 SDK 会优先应用厂商耳返性能,这样能够使这部分手机在耳返性能上体现出最好的成果。针对不反对耳返性能的手机设施,融云音视频 SDK 则采纳 openSL ES 的形式实现耳返性能,使这部分手机能够通过 openSL ES 实现较好的耳返成果。因为 openSL ES 在简单多样的 Android 零碎设施上存在兼容问题,针对这种状况,融云音视频 SDK 会采纳 Android  零碎 API 提供耳返性能,以确保音视频 SDK 的稳定性。这样融云音视频 SDK 不仅能最大水平的升高 Android 设施的耳返提早成果,而且能够最大限度的兼容不同的 Android 设施。​​​​

正文完
 0