Android 耳返实践 OpenSL ES AAudio Oboe

article/2025/7/4 3:45:08

耳返概述:

耳返主要实现监听的功能,在低延时的情况下可以给主播一个比较真实音频的反馈,在演唱会等专业场景里比较常用。
技术实现上来说就是要时时的把录制进的音频数据立刻播放出去,当然这个过程要低延迟。

AudioRecord,AudioTrack

在Android系统上做耳返,实现一个高性能的音频录制音频播放是一件很痛苦的事;因为我们并不能直接使用系统的AudioRecord,AudioTrack。这两个函数有很大的延迟,尤其是AudioTrack,不同的系统延迟范围在40ms到200ms之间。对于耳返来说有延迟感是不能忍受的。

那么不使用系统API实现,要怎么实现呢?

答案:直接和手机品牌厂商合作,拿到定制接口 hhh。
哈哈 ,如果你的公司有实力直接和各品牌厂商合作请忽略下面的内容。

OpenSL ES 和 AAudio

OpenSL ES:
OpenSL ES 是 Khronos Group 开发的 OpenSL ES™ API 规范的实现,专用于 Android。
NDK 软件包中OpenSL ES™ API 规范 Android 特定实现。利用这个库,不论是编写合成器、卡拉 OK、游戏还是其他实时应用,都可以使用 C 或 C++ 实现高性能、短延迟时间音频。
OpenSL ES Android demo: https://github.com/googlesamples/android-ndk/tree/master/audio-echo

AAudio:
AAudio 是作为 OpenSL ES 库的轻量级原生 Android 替代项而开发。 与 OpenSL ES 相比,AAudio API 不仅较小,而且容易使用。
AAudio 是在 Android O 版本中引入的全新 Android C API。 此 API 是专为需要低延迟的高性能音频应用而设计。 应用通过读取并将数据写入流来与 AAudio 进行通信。
AAudio Android demo: https://github.com/googlesamples/android-audio-high-performance/tree/master/aaudio

使用android系统底层的OpenSL ES或者AAudio都可以实现一个高性能的音频程序,尤其是AAudio更是简单易用,性能上,功能上都更佳,但是AAudio 是在 Android O 版本中才引入的全新 Android C API,在以前的系统版本中只能使用OpenSL ES。
那么我们需要做的是在新版本系统中使用AAudio,在不支持AAudio的系统版本中使用OpenSL ES,两套API同时使用。不要怕困难,因为这是一个即面向未来,又兼顾现在,历史的good idea。不要害怕这有多么困难,Google已经帮我们实现了——Oboe。

Oboe:https://github.com/google/oboe

在这里插入图片描述
Oboe是一个C ++库,可以轻松地在Android上构建高性能音频应用程序。内部有OpenSL ES和AAudio两大音频引擎,一行代码随意切换使用,我们可以用JNI在android应用上使用它们。

下面提供一下Oboe使用实例:

录制器

 setupCommonStreamParameters(oboe::AudioStreamBuilder *builder) {builder->setAudioApi(mAudioApi)->setSharingMode(oboe::SharingMode::Exclusive)->setPerformanceMode(oboe::PerformanceMode::LowLatency);return builder;setupRecordingStreamParameters(oboe::AudioStreamBuilder *builder ,bool isCallBack) {builder->setCallback(this)->setDirection(oboe::Direction::Input)return setupCommonStreamParameters(builder);oboe::AudioStream *mRecordingStream = nullptr;oboe::AudioStreamBuilder builder;setupRecordingStreamParameters(&builder);oboe::Result result = builder.openStream(&mRecordingStream);if (result == oboe::Result::OK && mRecordingStream) {oboe::Result result = mRecordingStream->requestStart();  //开始录制。}

播放器:

 setupCommonStreamParameters(oboe::AudioStreamBuilder *builder) {builder->setAudioApi(mAudioApi)->setSharingMode(oboe::SharingMode::Exclusive)->setPerformanceMode(oboe::PerformanceMode::LowLatency);return builder;setupPlayStreamParameters(oboe::AudioStreamBuilder *builder ,bool isCallBack) {builder->setCallback(this)->setDirection(oboe::Direction::output)return setupCommonStreamParameters(builder);oboe::AudioStream *mPlayStream = nullptr;oboe::AudioStreamBuilder builder;setupPlayStreamParameters(&builder);oboe::Result result = builder.openStream(&mPlayStream);if (result == oboe::Result::OK && mPlayStream) {oboe::Result result = mPlayStream->requestStart();  //开始播放。}oboe::DataCallbackResult LiveEffectEngine::onAudioReady(oboe::AudioStream *oboeStream, void *audioData, int32_t numFrames) {render(audioData,numFrames); //audioData放入数据即可播放。return oboe::DataCallbackResult::Continue;}

我们的项目在使用Oboe做录制和播放引擎后明显的优化了耳返延迟问题。之前120Ms的回路延迟设备,优化后延时在25Ms左右,对于用户来说已经感受不到了延迟回声感。
很遗憾在测试了很多设备后仍发现在vivo的部分手机上耳返优化并没有那么明显,还有延迟感;应该是这款设备在系统内部的音频模块上并没有遵循Google的设计规范。


http://chatgpt.dhexx.cn/article/vBahdi4B.shtml

相关文章

Android 音频 Native API OpenSL ES 简要介绍

OpenSL ES 全称 (Open Sound Library for Embedded Systems),嵌入式音频加速标准。 OpenSL ES 是无授权费、跨平台、针对嵌入式系统精心优化的硬件音频加速API。它为嵌入式移动多媒体设备上的本地应用程序开发者提供标准化, 高性能,低响应时间的音频功能实现方法,并实现软/硬…

Android12之OpenSL ES通过StreamPlayer和AudioToCbRenderer播放流程(二十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

【Android音视频】OpenSL ES音频播放示例一

本文将实现一个使用OpenSL ES来播放assets目录下mp3歌曲的demo(实际推荐大家使用oboe库)。 Android NDK之高性能音频https://developer.android.google.cn/ndk/guides/audio/opensl/getting-started Oboe is a C library that makes it easy to build …

OpenSL ES总结

OpenSL ES - 嵌入式音频加速标准。OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的硬件音频加速API。它为嵌入式移动多媒体设备上的本地应用程序开发者提供标准化, 高性能,低响应时间的音频功能实现方法,并实现软/硬件音频性能的直接跨平台部署&#xff…

最简单的OpenSL播放PCM实时音频

这里是c语言写的给android用的,可以拿到其他平台使用。既然是最简单的,肯定使用起来就是超级简单如回调方法就一句代码。这里简单说一下使用要注意的地方: 1.如果想要使用opensl的一些功能如音量控制: 只是这样是不可以的,拿到…

Android12之OpenSL ES通路hidl flag与hal flag转换原理(十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

分析OpenSL回声Demo

分析OpenSL回声Demo 前言 回声App是google的一个使用openSL的示例。 代码地址: https://github.com/android/ndk-samples/tree/main/audio-echo 通过代码可以学习到如何简单使用OpenSL采集音频,播放音频。 Demo的设计图 流程 App的大致流程为: 使用…

Android音视频【十三】OpenSL ES介绍基于OpenSL ES实现音频采集

人间观察 勿再别人的心中修行自己, 勿再自己的心中强求别人。 前言 最近写文章有点偷懒了,离上次写文章大概一个月了。 一般Android音频的采集在java层使用AudioRecord类进行采集。 但是为什么要学OpenSL呢?除了C/C的性能优势(不过其实java的效率也不…

Harmony Native开发-我的OpenSL ES录音机

零、写在前面 最早我是在Android上开发的OpenSL ES。但最近看了下鸿蒙的文档,发现它的底层库也支持OpenSL ES,这我的兴致就来了。简单了解了一下鸿蒙的Native开发,就着手开发起来。移植过程中发现其实对Android程序员还是相当友好的&#xf…

Android中opensl架构,Android OpenSL ES详解

简介 NDK开发OpenSL ES跨平台高效音频解决方案.png OpenSL ES全称为Open Sound Library for Embedded Systems,即嵌入式音频加速标准。OpenSL ES是无授权费、跨平台、针对嵌入式系统精心优化的硬件音频加速 API。它为嵌入式移动多媒体设备上的本地 应用程序开发者提供了标准化…

音视频学习 AudioTrack、OpenSL ES 音频渲染

前言 在讲解音频渲染之前,需要对音频的基础知识有所了解,所以该篇分为基础概念和AudioTrack 以及 OpenSL ES Demo 实例讲解,这样有助于更好的理解 Android 中音频渲染。 音频的基础概念涉及的知识点比较多,该篇文章的上半部分会…

OpenSL ES技术分析

背景简介 OpenSL ES是一种针对嵌入式系统特别优化过的硬件音频加速API,无授权费并且可以跨平台使用。它提供的高性能、标准化、低延迟的特性实现为嵌入式媒体开发提供了标准,嵌入式开发者在开发本地音频应用也将变得更为简便,利用该API能够实…

使用MediaCodec+OpenSL编写简单的音频播放器

使用MediaCodecOpenSL编写简单的音频播放器 前言 通过MediaCodec Native API 和OpenSL编写一个简单的音频播放器。可以解码并播放一个mp3文件. 流程 初始化 使用AMediaExtractor解析Mp3文件,它可以得到音频文件的格式、以及帧(未解码)。…

使用Android高性能音频--OpenSL ES和AAudio

AAudio的概念介绍: AAudio 是作为 OpenSL ES 库的轻量级原生 Android 替代项而开发。 与 OpenSL ES 相比,AAudio API 不仅较小,而且容易使用。 AAudio 是在 Android O 版本中引入的全新 Android C API。 因此 API 是专为需要低延迟的高性能音频应用而设…

opensl学习笔记

这个是看opensl文档看到的一个简单的使用示例图,单纯看代码的话很难理解opensl播放和采集的原理,可以结合图来理解。使用Audio Player来播放音频,DataSource类型为SLDataSource,例如安卓设备就是SL_DATALOCATOR_ANDROIDSIMPLEBUFF…

使用OpenSL直接播放mp3

使用OpenSL直接播放mp3 前言 通过使用OpenSL来播放一个mp3文件来学习openSL的使用方式。 设计 在android平台播放mp3方式有多种方式入使用MediaPlayer、AudioTrack、OpenSL、oboe等。根据使用MediaPlayer,AudioTrack的经验一个播放器需要有的基础功能有加载数据、开始、暂停…

音视频开发之旅(36) -FFmpeg +OpenSL ES实现音频解码和播放

目录 OpenSL ES基本介绍OpenSL ES播放音频流程代码实现遇到的问题资料收获 上一篇我们通过AudioTrack实现了FFmpeg解码后的PCM音频数据的播放,在Android上还有一种播放音频的方式即OpenSL ES, 什么是OpenSL ES,这个我们平时接触的很少,原因…

Android OpenSL ES 开发:Android OpenSL 介绍和开发流程说明

一、Android OpenSL ES 介绍 OpenSL ES (Open Sound Library for Embedded Systems)是无授权费、跨平台、针对嵌入式系统精心优化的硬件音频加速API。它为嵌入式移动多媒体设备上的本地应用程序开发者提供标准化, 高性能,低响应时间的音频功能实现方法,并实现软/硬件…

Xcode7 网络请求报错:The resource could not be loaded because the App Transport Security policy requir...

Google后查证,iOS9引入了新特性App Transport Security (ATS)。详情:App Transport Security (ATS)新特性要求App内访问的网络必须使用HTTPS协议。但是现在公司的项目使用的是HTTP协议,使用私有加密方式保证数据安全。现在也不能马上改成HTTP…

【用户自定义气象站】

自定义气象站系统由数据采集器、传感器、总线模块、网络模块、供电模块等组成,可实现野外无人看守的情况下长期监测。用户可根据自己的需求,自定义测量指标,以达到观测目的。 自定义气象站测量指标 自定义气象站测量参数指标 总辐射、光合…