| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android音频子系统(十一)------耳机返听(耳返)原理实现 -> 正文阅读 |
|
[移动开发]Android音频子系统(十一)------耳机返听(耳返)原理实现 |
你好!这里是风筝的博客,欢迎和我一起交流。耳返,也就是耳机返听,一般用在演唱会直播、手机K歌、KTV等场景。 耳返常见的两种实现方式:
两种方法各有利弊:在HAL实现的话需要考虑不同采样率之间的混音问题。在AF实现,多了一层通路会导致耳返延时变大(150ms-300ms)。 一般我更喜欢在HAL实现,因为延时是耳返很重要的一个指标。(耳返延时是指声音在设备上的往返延迟: 音频信号从mic进入应用处理,再由输出设备输出,这整个过程所花费的时间就是声音的完整往返时间。) 之前在芯片原厂的时候,也有个需求,客户需要一个低延时耳返功能,要求延时在30ms之内,主要用户KTV场景,需要我们芯片原厂提供方案。 一般人耳对声音不能分辨出 30ms之内的差值,如果延时大于 30ms,人听到的耳返声音就会有“错位”的感觉,如果大于 50ms 就会明显感觉到延迟的存在。 老东家的芯片是支持硬件混音的,可以节省掉一点时间。当时也是尝试在HAL层去做,因为虽然硬件支持混音,但是没有方法在芯片内部做到mic loopback spk,所以还得在HAL里起线程,将mic数据送到playback去才能在底层混音。 当时实测延时在100ms左右,其实我们知道,延时是和buffer size相关的,buf大的话延时势必会高。 但是会有一个很致命的问题,buffer size太小会有xrun的风险,导致播放出现overrun,录音出现underrun,造成卡顿和杂音… 方案比较粗糙,不过当时也没有其他方案了。 但是来到手机厂之后,因为手机上面主要是做K歌的耳机返听,居然发现了更牛逼的实现,太猛了! 这里主要以全民K歌为例,在全民K歌开启耳机返听的情况下,因为设置了fast flag,所以会用比较小的buffer size进行数据传输,这样可以保证更好的实时性、低延时。 高通的话是在ADSP内部搭建通路,这部分不太了解不做评价。 这里主要探讨没有ADSP的方案:从Android到Linux底层这一个音频流程中寻找切入点,将上行人声和下行音乐混音,建立耳返通路,并减小这一个耳返通路的buffer size以提高实时性的要求。 如果还像之前的方案一样的话,在HAL做mix,因为在混音后的下行通路上仍存在由ALSA管理的ring buffer作为Audio out线程和芯片底层中断交互的缓存,这一个缓存就是播放通路本身的缓存,这一个缓存大小对应的声音时长接近120ms,这样的延时是明显不能满足低延时的要求的,但是又不能将buffer size减小,否则用户在用手机播放时必然会受到影响,有卡顿、杂音的风险,这是厂商不能承受的。 此时就出现了一个难点:耳返的人声必须要使用小的buffer size保证实时性,而播放音乐使用的是大buffer size且不能随意调整大小,耳返方案必须完全满足以上两点需求。 所以,我们必须在播放流程的更”下游”找到一个小buffer size作为混音切入点。 这一个ring buffer的读写机制并没有特别之处,在播放的场合,AudioOut线程作为供应者不断写入数据,写指针不断增加,增加的大小达到buffer总大小后就复位,重新开始覆盖原来的数据进行写入;而底层芯片中断则作为消费者,不断消耗数据,读指针不断增加,增加的大小达到buffer总大小后就复位,保持处于写指针的后方,不断跟随着写指针。 这样我们就可以有一个大胆的想法:将人声混入写指针与读指针之间的buffer,混入点的指针位置与底层中断的读指针越接近,实时性就必然越高。方案的实现原理如下图: 至此,完整方案就出来了,兼容了以小buffer size播放低延时人声和以原有的大buffer播放高延时音乐这两点需求。 其实在Android O上面,引入AAUDIO专门针对低延时高性能的音频应用设计(在以前的系统版本中只能使用OpenSL ES),这是官网的介绍: 不过也有两个难点: 所以为了针对不同 Android 手机实现最优的延迟效果,各个手机厂商都是自己优化系统底层逻辑,针对 Android 系统的音频耳返功能优化出最理想的效果,自己实现耳返功能。 网上这块倒是没有看到有其他厂家是如何实现的,看到有个博主po有一张图: 这部分是不是真的就不知道了,有懂哥的话可以留言讨论下~ AF实现可以参考:Android耳返功能的实现 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 5:17:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |