美文网首页
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