如何解决移动直播下的耳返延迟问题
耳返是主持人或歌手在一些大型晚会现场会佩戴的一种电子设备。耳返其实是“使用耳机形式的返送”,它是包括耳机、无线接收器、无线发射器,混音器等一系列设备的总称,与之对比的是“地返”,是指装在舞台前方固定的用来返送的音响。
对于歌手而言,演出现场往往是个很大的空间,会有声音的延迟或变质,当歌手在现场演唱时往往听不到自己的声音,或者听到伴奏时已发生延迟,所以需要耳返把伴奏送到歌手耳边以保证他们不会唱错拍子或走音走调。
耳返存在的问题
通过前面的介绍我们了解到,耳返的使用对延时性要求比较高,如果延时大于 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 设备。
如何解决移动直播下的耳返延迟问题相关推荐
- Zego SDK深度适配安卓机型,实现超低延迟耳返
耳返功能又称耳机返听,耳机采集监听,在设备上插入耳机(普通耳机或蓝牙耳机),能从耳机侧听到麦克风采集的声音. 该功能可以使主播在K歌直播.K歌歌曲录制.个人清唱,朗诵等场景下实时监听自己的声音,让观众 ...
- Android音频子系统(十一)------耳机返听(耳返)原理实现
你好!这里是风筝的博客, 欢迎和我一起交流. 耳返,也就是耳机返听,一般用在演唱会直播.手机K歌.KTV等场景. 例如在嘈杂的演唱环境里,通过佩戴耳返,歌手能清楚地听到伴奏和自己的声音,来鉴定自己有没 ...
- Flutter耳返和双声道功能的实现
1 耳返功能简介 ZEGO Express SDK 提供了Flutter耳返和双声道的功能,在视频直播.K歌.音频录制等场景下广泛应用,开发者可根据实际业务场景需要设置,一套代码可实现跨平台音视频耳返 ...
- Android 耳返实践 OpenSL ES AAudio Oboe
耳返概述: 耳返主要实现监听的功能,在低延时的情况下可以给主播一个比较真实音频的反馈,在演唱会等专业场景里比较常用. 技术实现上来说就是要时时的把录制进的音频数据立刻播放出去,当然这个过程要低延迟. ...
- 声网Agora SDK支持50ms超低延时耳返 适配主流手机机型
近年来,随着网络直播的火爆,直播唱歌成为了很多主播在直播间的必备技巧,同时全民K歌.唱吧等在线K歌软件的兴起,也让很多人足不出户也能享受K歌的乐趣,并成为越来越多人偏爱的在线娱乐方式.而不管是直播唱歌 ...
- 基于Android实现K歌场景下超低延时耳返
1 功能简介 在音视频应用中我们经常涉及到耳机麦克风和设备麦克风的切换.不同声道的配置.在遇到这种情况的时候,我们如何配置呢? 耳返即耳机采集监听,在设备上插入耳机(普通耳机或蓝牙耳机)后,能从本机耳 ...
- HMS Core积极探索基于硬件耳返的功能,助力唱吧整体唱歌延迟率降低60%
唱吧的使命是让唱歌更简单.让生活更美好,其布局的K歌业务专注于让曲库更全.音质更好,开创了同框合唱.弹唱等有意思的游戏类K歌玩法.为了让用户拥有更加沉浸的娱乐体验,唱吧与HMS Core积极探索基于硬 ...
- AudioUnit录制音频+耳返(四)
前言 视频直播,K歌应用等等都会有音频录制的功能,音频录制时还可以带有耳返效果,那这些是如何实现的呢?如果仅仅是录制音频,那使用IOS的AudioQueue框架实现即可,但是在直播这些实时性要求比较高 ...
- Android耳返功能的实现
本文要介绍的是一个耳返功能,就是实现插入usb mic之后就打通一个usb mic到speaker的回环,把拿到的usb mic的数据直接写到下行.有两种方案,一种方式是audio hal拿到mic数 ...
最新文章
- 从原型链看DOM--Node类型
- win8.1下jdk的安装和环境变量的配置 eclipse的安装和汉化
- 1.3字符串 确定两串乱序同构
- 第五节:Task构造函数之TaskCreationOptions枚举处理父子线程之间的关系。
- 牛逼,Java中表达式引擎工具就用它!建议收藏,一定用的到!!
- php 随机数 名称,php – 从标题更改为随机数
- oracle blob update,Oracle数据库中对BLOB数据的操作问题
- 中信证券:维持贝壳“买入”的投资评级
- 3.21 Refused Bequest 被拒绝的馈赠
- 《经营的本质》序“经营的逻辑”--读后感及读书笔记
- 解决Number of partitions scanned (=2001) on table ‘tablexx‘ exceeds limit (=2000)
- Scrum: 时间框 (Timeboxing) 是什么?
- 2022-2028年全球与中国屏幕指纹传感器行业发展趋势及投资战略分析
- Python matplotlib数据可视化 subplot绘制多个子图
- ks 曲线_ROC、KS曲线及AUC、KS值
- vue中css写法_vue css 写法大全
- 《孙子兵法》帮你找到不合格的管理者
- 【经验】知乎、科学网的经典帖子分享
- Hadoop:MapReduce编程之统计二手房数目
- MTK_android项目驱动设置