美文网首页
Android OpenSL 01 --- 简介

Android OpenSL 01 --- 简介

作者: 沪漂意哥哥 | 来源:发表于2022-04-18 23:10 被阅读0次

一、首先OpenSL ES是什么?

简单来说OpenSL ES是一个嵌入式跨平台免费的音频处理库。

二、OpenSL ES库在哪里?

Android的OpenSL ES库是在NDK的platforms文件夹对应android平台先相应cpu类型里面,如: image.png

三、OpenSL ES开发流程和重要接口

通过分析android-ndk中native-audio的代码,发现了用OpenSL ES来开发应用也是有套路(规律)可寻的:

3.1OpenSL ES的开发流程主要有如下6个步骤:
    1、创建接口对象

    2、设置混音器

    3、创建播放器(录音器)

    4、设置缓冲队列和回调函数

    5、设置播放状态

    6、启动回调函数

    其中4和6是播放PCM等数据格式的音频是需要用到的。
3.2OpenSL ES中最重要的接口类SLObjectItf
    通过SLObjectItf接口类我们可以创建所需要的各种类型的类接口,比如:

    创建引擎接口对象:SLObjectItf engineObject

    创建混音器接口对象:SLObjectItf outputMixObject

    创建播放器接口对象:SLObjectItf playerObject

    以上等等都是通过SLObjectItf来创建的,知道了这个规则后,看源代码就会轻松很多了
3.3利用SLObjectItf来创建具体的接口对象实例
 OpenSL ES中也有具体的接口类,比如(引擎:SLEngineItf,播放器:SLPlayItf,声音控制器:SLVolumeItf等等)。
3.4创建引擎并实现它

OpenSL ES中开始的第一步都是声明SLObjectItf接口类型的引擎接口对象engineObject,然后用方法slCreateEngine创建一个引擎接口对象;创建好引擎接口对象后,需要用SLObjectItf的Realize方法来实现engineObject;最后用SLObjectItf的GetInterface方法来初始化SLEngnineItf对象实例。如:

SLObjectItf engineObject = NULL;//用SLObjectItf声明引擎接口对象
SLEngineItf engineEngine = NULL;//声明具体的引擎对象实例

void createEngine()
{
    SLresult result;//返回结果
    result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);//第一步创建引擎
    result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);//实现(Realize)engineObject接口对象
    result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);//通过engineObject的GetInterface方法初始化engineEngine
}

3.5利用引擎对象创建其他接口对象

其他接口对象其他接口对象(SLObjectItf outputMixObject,SLObjectItf playerObject)等都是用引擎接口对象创建的(具体的接口对象需要的参数这里就说了,可参照ndk例子里面的),如:

//混音器
SLObjectItf outputMixObject = NULL;//用SLObjectItf创建混音器接口对象
SLEnvironmentalReverbItf outputMixEnvironmentalReverb = NULL;创建具体的混音器对象实例
 
result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 1, mids, mreq);//利用引擎接口对象创建混音器接口对象
result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);//实现(Realize)混音器接口对象
result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB, &outputMixEnvironmentalReverb);//利用混音器接口对象初始化具体混音器实例
 
//播放器
SLObjectItf playerObject = NULL;//用SLObjectItf创建播放器接口对象
SLPlayItf playerPlay = NULL;//创建具体的播放器对象实例
 
result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc, &audioSnk, 3, ids, req);//利用引擎接口对象创建播放器接口对象
result = (*playerObject)->Realize(playerObject, SL_BOOLEAN_FALSE);//实现(Realize)播放器接口对象
result = (*playerObject)->GetInterface(playerObject, SL_IID_PLAY, &playerPlay);//初始化具体的播放器对象实例
3.6最后就是使用创建好的具体对象实例来实现具体的功能。

相关文章

网友评论

      本文标题:Android OpenSL 01 --- 简介

      本文链接:https://www.haomeiwen.com/subject/alttertx.html