HarmonyOS 音频开发指导:使用 OpenSL ES 开发音频播放功能

news2024/9/22 17:35:33

OpenSL ES 全称为 Open Sound Library for Embedded Systems,是一个嵌入式、跨平台、免费的音频处理库。为嵌入式移动多媒体设备上的应用开发者提供标准化、高性能、低延迟的 API。HarmonyOS 的 Native API 基于Khronos Group开发的OpenSL ES 1.0.1 API 规范实现,开发者可以通过<OpenSLES.h>和<OpenSLES_OpenHarmony.h>在 HarmonyOS 上使用相关 API。

HarmonyOS 上的 OpenSL ES

OpenSL ES 中提供了以下的接口,HarmonyOS 当前仅实现了部分OpenSL ES接口,可以实现音频播放的基础功能。

调用未实现接口后会返回 SL_RESULT_FEATURE_UNSUPPORTED,当前没有相关扩展可以使用。

以下列表列举了 HarmonyOS 上已实现的 OpenSL ES 的接口,具体说明请参考OpenSL ES规范:

● HarmonyOS 上支持的 Engine 接口:

SLresult (*CreateAudioPlayer) (SLEngineItf self, SLObjectItf * pPlayer, SLDataSource *pAudioSrc, SLDataSink *pAudioSnk, SLuint32 numInterfaces, const SLInterfaceID * pInterfaceIds, const SLboolean * pInterfaceRequired)

○ SLresult (*CreateAudioRecorder) (SLEngineItf self, SLObjectItf * pRecorder, SLDataSource *pAudioSrc, SLDataSink *pAudioSnk, SLuint32 numInterfaces, const SLInterfaceID * pInterfaceIds, const SLboolean * pInterfaceRequired)

○ SLresult (*CreateOutputMix) (SLEngineItf self, SLObjectItf * pMix, SLuint32 numInterfaces, const SLInterfaceID * pInterfaceIds, const SLboolean * pInterfaceRequired)

● HarmonyOS 上支持的 Object 接口:SLresult (*Realize) (SLObjectItf self, SLboolean async)

○ SLresult (*GetState) (SLObjectItf self, SLuint32 * pState)

○ SLresult (*GetInterface) (SLObjectItf self, const SLInterfaceID iid, void * pInterface)

○ void (*Destroy) (SLObjectItf self)

● HarmonyOS 上支持的 Playback 接口:SLresult (*SetPlayState) (SLPlayItf self, SLuint32 state)

○ SLresult (*GetPlayState) (SLPlayItf self, SLuint32 *pState)

● HarmonyOS 上支持的 Volume 控制接口:SLresult (*SetVolumeLevel) (SLVolumeItf self, SLmillibel level)

○ SLresult (*GetVolumeLevel) (SLVolumeItf self, SLmillibel *pLevel)

○ SLresult (*GetMaxVolumeLevel) (SLVolumeItf self, SLmillibel *pMaxLevel)

HarmonyOS 上支持的 BufferQueue 接口:以下接口需引入<OpenSLES_OpenHarmony.h>使用。

完整示例

参考以下示例代码,播放一个音频文件。

1.  添加头文件。

#include <OpenSLES.h>#include <OpenSLES_OpenHarmony.h>#include <OpenSLES_Platform.h>

2.  使用 slCreateEngine 接口和获取 engine 实例。

SLObjectItf engineObject = nullptr;slCreateEngine(&engineObject, 0, nullptr, 0, nullptr, nullptr);(*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);

3.  获取接口 SL_IID_ENGINE 的 engineEngine 实例。

SLEngineItf engineEngine = nullptr;(*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);

4.  配置播放器信息,创建 AudioPlayer。

SLDataLocator_BufferQueue slBufferQueue = {    SL_DATALOCATOR_BUFFERQUEUE,    0};
// 具体参数需要根据音频文件格式进行适配SLDataFormat_PCM pcmFormat = {    SL_DATAFORMAT_PCM,    2,                           // 通道数    SL_SAMPLINGRATE_48,          // 采样率    SL_PCMSAMPLEFORMAT_FIXED_16, // 音频采样格式    0,    0,    0};SLDataSource slSource = {&slBufferQueue, &pcmFormat};SLObjectItf pcmPlayerObject = nullptr;(*engineEngine)->CreateAudioPlayer(engineEngine, &pcmPlayerObject, &slSource, null, 0, nullptr, nullptr);(*pcmPlayerObject)->Realize(pcmPlayerObject, SL_BOOLEAN_FALSE);

5.  获取接口 SL_IID_OH_BUFFERQUEUE 的 bufferQueueItf 实例。

SLOHBufferQueueItf bufferQueueItf;(*pcmPlayerObject)->GetInterface(pcmPlayerObject, SL_IID_OH_BUFFERQUEUE, &bufferQueueItf);

6.  打开音频文件,注册 BufferQueueCallback 回调。

static void BufferQueueCallback (SLOHBufferQueueItf bufferQueueItf, void *pContext, SLuint32 size){    SLuint8 *buffer = nullptr;    SLuint32 pSize;    (*bufferQueueItf)->GetBuffer(bufferQueueItf, &buffer, &pSize);    // 将待播放音频数据写入buffer    (*bufferQueueItf)->Enqueue(bufferQueueItf, buffer, size);}void *pContext; // 可传入自定义的上下文信息,会在Callback内收到(*bufferQueueItf)->RegisterCallback(bufferQueueItf, BufferQueueCallback, pContext);

7.  获取接口 SL_PLAYSTATE_PLAYING 的 playItf 实例,开始播放。

SLPlayItf playItf = nullptr;(*pcmPlayerObject)->GetInterface(pcmPlayerObject, SL_IID_PLAY, &playItf);(*playItf)->SetPlayState(playItf, SL_PLAYSTATE_PLAYING);

8.  结束音频播放。

(*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);(*pcmPlayerObject)->Destroy(pcmPlayerObject);(*engineObject)->Destroy(engineObject);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1132084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全志R128基础组件开发指南——SPI LCD 显示驱动

SPI LCD 显示驱动 简介 R128 平台提供了 SPI DBI 的 SPI TFT 接口ACCC&#xff0c;具有如下特点&#xff1a; Supports DBI Type C 3 Line/4 Line Interface ModeSupports 2 Data Lane Interface ModeSupports data source from CPU or DMASupports RGB111/444/565/666/888 …

买学生台灯主要看什么?双十一值得入手的学生台灯

对于台灯来说主要是光源的问题。随着科技时代发展&#xff0c;那种原有的白炽灯&#xff0c;钨丝灯早已不见&#xff0c;换言之是更多的LED灯&#xff0c;再加之它体积小便于安装&#xff0c;而且光线更加均匀柔和&#xff0c;所以深受用户的青睐。 而台灯又是孩子学习必不可少…

2023年【汽车驾驶员(中级)】报名考试及汽车驾驶员(中级)证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;中级&#xff09;报名考试根据新汽车驾驶员&#xff08;中级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将汽车驾驶员&#xff08;中级&#xff09;模拟考试试题进行汇编&…

Shopee买家通系统全自动化操作简单方便又快速

Shopee买家通系统是一款专门针对虾皮买家号所开发的全自动化操作系统&#xff0c;可以自动注册、自动加购加心愿单、自动下单等。 1、全自动化注册 准备好账号需要的资料后即可运行注册任务&#xff0c;程序运行时可以自动输入手机号、自动接收短信、自动输入账号密码。账号支…

浙大陈越何钦铭数据结构06-图1 列出连通集

题目 给定一个有N个顶点和E条边的无向图&#xff0c;请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时&#xff0c;假设我们总是从编号最小的顶点出发&#xff0c;按编号递增的顺序访问邻接点。 输入格式: 输入第1行给出2个整数N(0<N≤10)和E&…

2023年9月青少年机器人技术(四级)等级考试试卷-理论综合

2023.9青少年机器人技术等级考试理论综合试卷&#xff08;四级&#xff09; 分数&#xff1a;100 题数&#xff1a;30 一、单选题(共20题&#xff0c;共80分) 1. Arduino C程序如下&#xff0c;当程序运行时&#xff0c;串口监视器输出结果是&#xff1f;&#xff08; &…

微信视频号怎么下载视频?

微信视频号视频和其他平台有个最大的区别就是&#xff0c;没有链接&#xff0c;其他的下载器无法解析&#xff0c;知道我发现了一款非常适用于微信的下载工具&#xff0c;只需要将视频转发下载机器人就能一键解析成功&#xff0c;这么听着有点不懂对不对&#xff1f;别急&#…

【C++代码】回溯,子集,组合,全排列,去重--代码随想录

题目&#xff1a;分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。 在for (int i startIndex; i < s.size(); i)循环中&#xff0c;我们 定义了…

app开发者提升第四季度广告收入的方法

第四季度将迎来双十一、双十二、圣诞、元旦为主的电商购物季&#xff0c;这是一年中利用线上消费为全新年度和全新预算做好准备的最佳时机&#xff0c;从过往的变现成功案例中汇总了优化要点&#xff0c;帮助开发者在第四季度和未来一年获取更多广告收益。 https://www.shensh…

利用IT服务台软件提高客户满意度的4种方法

客户满意度在整个业务过程中常常会被忽视&#xff0c;但其却是业务增长的重要因素。显而易见&#xff1a;满意的客户会在曾购买过的产品上停留更长的时间&#xff0c;也更有可能交叉购买或再次购买。他们会表现出品牌忠诚度&#xff0c;通常会增加在贵公司的平均消费金额。 而满…

Linux ————VI编辑器

&#xff08;一&#xff09;VI编辑器 当提及Unix和Linux系统中的编辑工具&#xff0c;我们不能不提到VI编辑器。这款编辑器对于这些系统来说&#xff0c;犹如Windows系统中的记事本&#xff0c;是标配且不可或缺的。它不仅功能强大&#xff0c;而且其标准操作在各个Unix及Linux…

MySQL2:MySQL中一条查询SQL是如何执行的?

MySQL2&#xff1a;MySQL中一条查询SQL是如何执行的&#xff1f; MySQL中一条查询SQL是如何执行的&#xff1f;1.连接怎么查看MySQL当前有多少个连接&#xff1f;思考&#xff1a;为什么连接数是查看线程&#xff1f;客户端的连接和服务端的线程有什么关系&#xff1f;MySQL参数…

NCH Doxillion Plus forMac/win:超越转换,实现多格式文档无缝对接

在今天这个数字化时代&#xff0c;文档格式的转换已成为我们日常生活和工作中不可或缺的一部分。不同的文件格式&#xff0c;如.docx&#xff0c;.pdf&#xff0c;.pptx&#xff0c;.jpg等&#xff0c;常常让我们在处理和阅读时感到困扰。为了解决这个问题&#xff0c;NCH Soft…

Jmeter 接口测试,参数值为列表,如何参数化?

最近在我的教学过程中&#xff0c;我的一个学生问了我一个问题&#xff0c;他们公司的一个接口参数值是列表&#xff0c;列表中值的数量有多有少&#xff0c;问我在 jmeter 中如何让这个参数的值进行参数化&#xff1f; 看到这种问题&#xff0c;你的第一反应是什么&#xff1f…

【Mybatis源码】XMLConfigBuilder构建器 - 读取XML配置初始化Configuration对象

XMLConfigBuilder是Mybatis中定义的进行构建Configuration对象的类,此类用于读取XML配置文件创建并初始化Configuration对象; 上一篇中我们介绍了XMLConfigBuilder构建器加载XML配置文件以及创建Configuration对象https://blog.csdn.net/m1729339749/article/details/133983…

如何通过adb控制安卓手机wifi

一、准备工作 1、先用USB数据线 将手机和电脑连接在一起 1&#xff09; 数据线连接手机和电脑&#xff0c;选择“传输文件”的连接方式&#xff1b; 2&#xff09; 在手机上&#xff0c;打开“开发者选项”、“USB调试”&#xff1b; 2、在电脑上安装adb工具&#xff0c;参考…

CRM系统如何管理另类数据?

“另类数据”是近些年比较火的词&#xff0c;得益于通信技术、数据基础设施的发展&#xff0c;以前无法留存的数据得以被大规模的存储和积累&#xff0c;并逐步在宏观及微观层面开始应用。另类数据相比传统数据更具实时性&#xff0c;前景更被看好。那么&#xff0c;CRM系统如何…

AI是未来?——token词表BPE

AI是未来&#xff1f;——token&词表&BPE 文章目录 AI是未来&#xff1f;——token&词表&BPE引⾔Token简介⼤模型的词元⽅案 - ⼦词BPEBPE是什么&#xff1f;举例&#xff1a;BPE在NLP中的应⽤BPE是如何实现编码和解码的&#xff1f;说明&#xff1a;有了词表之…

喜报|亚数成功入选2023年度徐汇区企业技术中心

近日&#xff0c;徐汇区商务委员会公示了2023年度徐汇区企业技术中心认定企业名单。亚数信息科技&#xff08;上海&#xff09;有限公司&#xff08;以下简称亚数&#xff09;凭借突出的技术创新能力&#xff0c;成功入选2023年度徐汇区企业技术中心。 图源&#xff1a;上海市徐…

「AI知多少」第一期推荐《生命3.0》

本文主要介绍《生命3.0》AI相关的读书心得 一、书名 《生命3.0》 二、简介 《生命3.0》一书中&#xff0c;作者迈克斯泰格马克对人类的终极未来进行了全方位的畅想&#xff0c;从我们能活到的近未来穿行至1万年乃至10 亿年及其以后&#xff0c;从可见的智能潜入不可见的意识…