一、OpenSL ES介紹
OpenSL ES是指Open Sound System for Embedded Systems,是一種開放式、跨平台的、低延遲的音頻編程接口,主要用於嵌入式音頻應用,比如遊戲、音頻處理、多媒體等。Android系統中使用的就是OpenSL ES的API。
OpenSL ES與Java音頻API(Java Sound API)結構不同。JavaAPI的機制運行在Java虛擬機上,可以幫助應用程序的開發者隱藏從不同硬件廠商所帶來的差異。OpenSL ES提供較底層的音頻編程接口,它使開發者能夠直接訪問移動設備上運行的硬件,並精確控制音頻數據的流動,以便提供高質量、低延遲的音頻輸出。
在OpenSL ES中,所有音頻需要在一個對應的Audio插槽(Audio Object)中進行處理,並且每個插槽都可以包含多個音頻流。一個應用程序可以創建多個Audio插槽,通過控制音頻流的流動,實現音頻輸出的控制。
二、OpenSL ES的特點
1、低延遲:OpenSL ES提供了一種精細控制音頻數據流動的機制,使得音頻處理的延遲得以控制,實現低延遲的音頻輸出。
2、高效性:OpenSL ES提供了多種良好的音頻處理API,如音效處理、音量控制、均衡器等等,易於移植到設備上。
3、跨平台:OpenSL ES是一種開放式的音頻編程接口,可以在嵌入式設備和移動設備上使用,具有很好的系統兼容性,易於移植到其他平台上。
三、OpenSL ES在Android平台上的應用
1、AudioPlayer播放音頻文件
可以使用OpenSL ES播放WAV格式的音頻文件,通過OpenSL ES可以更好地控制數據的流動,從而獲得更低延遲的音頻輸出效果。下面是一個簡單的AudioPlayer的代碼示例:
//定義播放器 SLObjectItf pPlayerObj; //定義播放器接口 SLPlayItf pPlayer; //定義緩衝隊列接口 SLAndroidSimpleBufferQueueItf pBuffQueue; //定義音頻格式參數 SLDataFormat_PCM pcm; //定義音頻源地址 SLDataLocator_AndroidFD android_fd; //創建Audio對象 slCreateEngine(&engineObj, 0, NULL, 0, NULL, NULL); //實例化Audio對象 (*engineObj)->Realize(engineObj, SL_BOOLEAN_FALSE); //獲取Audio對象的接口 (*engineObj)->GetInterface(engineObj, SL_IID_ENGINE, &engine); //設置Audio源地址 android_fd.locatorType = SL_DATALOCATOR_ANDROIDFD; android_fd.fd = audioFD; android_fd.offset = startByte; android_fd.length = length; //設置音頻格式參數 pcm.formatType = SL_DATAFORMAT_PCM; pcm.numChannels = numChannels; pcm.samplesPerSec = sampleRate; pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; pcm.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16; pcm.channelMask = channelMask; pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; //創建播放器對象 const SLInterfaceID ids[2] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_PLAY}; const SLboolean req[2] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE}; (*engine)->CreateAudioPlayer(engine,pPlayerObj, &android_fd, &pcm, 2, ids, req); //realize播放器對象 (*pPlayerObj)->Realize(pPlayerObj,SL_BOOLEAN_FALSE); //獲取播放器接口 (*pPlayerObj)->GetInterface(pPlayerObj,SL_IID_PLAY, &pPlayer); //獲取緩衝隊列接口對象 (*pPlayerObj)->GetInterface(pPlayerObj, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &pBuffQueue); //註冊緩衝隊列回調 (*pBuffQueue)->RegisterCallback(pBuffQueue, BufferCallback, NULL); (*pPlayer)->SetPlayState(pPlayer,SL_PLAYSTATE_PLAYING);
2、AudioRecorder錄製音頻文件
使用OpenSL ES還可以錄製音頻文件,通過設置輸入源、音頻格式等參數,可以方便地控制音頻數據的採集。下面是一個簡單的AudioRecorder的代碼示例:
//創建Audio對象 slCreateEngine(&engineObj, 0, NULL, 0, NULL, NULL); //實例化Audio對象 (*engineObj)->Realize(engineObj, SL_BOOLEAN_FALSE); //獲取Audio對象的接口 (*engineObj)->GetInterface(engineObj, SL_IID_ENGINE, &engine); //設置音頻格式參數 SLDataLocator_IODevice loc_dev = {SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, SL_DEFAULTDEVICEID_AUDIOINPUT, NULL}; SLDataSource audioSrc = {&loc_dev, NULL}; SLDataLocator_AndroidSimpleBufferQueue loc_bq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2}; SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 2, 44100, 2, 16, SL_BYTEORDER_LITTLEENDIAN, SL_PCMSAMPLEFORMAT_FIXED_16}; SLDataSink audioSnk = {&loc_bq, &format_pcm}; //創建錄音機對象 const SLInterfaceID id[1] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE}; const SLboolean req[1] = {SL_BOOLEAN_TRUE}; (*engine)->CreateAudioRecorder(engine, &recorderObj, &audioSrc, &audioSnk, 1, id, req); //Realize錄音機對象 (*recorderObj)->Realize(recorderObj, SL_BOOLEAN_FALSE); //獲取錄音機接口 (*recorderObj)->GetInterface(recorderObj, SL_IID_RECORD, &recorder); //獲取錄音機BufferQueue接口 (*recorderObj)->GetInterface(recorderObj, SL_IID_ANDROIDSIMPLEBUFFERQUEUE,&recorderBufferQueue); //設置回調函數 (*recorderBufferQueue)->RegisterCallback(recorderBufferQueue,RecorderCallback, NULL); (*recorder)->SetRecordState(recorder, SL_RECORDSTATE_RECORDING);
3、AudioEffect音效處理
OpenSL ES還提供了多種音效處理接口,如EQualizer、BassBoost、Virtualizer等等。可以使用這些API來對音頻進行處理,提高音頻的質量。下面是一個簡單的音效處理的代碼示例:
//創建Audio對象 slCreateEngine(&engineObj, 0, NULL, 0, NULL, NULL); //實例化Audio對象 (*engineObj)->Realize(engineObj, SL_BOOLEAN_FALSE); //獲取Audio對象的接口 (*engineObj)->GetInterface(engineObj, SL_IID_ENGINE, &engine); //創建混音器 (*engine)->CreateOutputMix(engine, &outputMixObj, 2, ids, req); //realize混音器對象 (*outputMixObj)->Realize(outputMixObj, SL_BOOLEAN_FALSE); //定義均衡器接口 SLEqualizerItf pEqualizer; //定義均衡器對象 SLObjectItf pEqualizerObj; //定義混音器接口 SLAndroidEffectCapabilitiesItf pEffectDesc; //定義混音器接口 sLAndroidEffectItf pEffect; //定義音效源地址 SLDataLocator_AndroidSimpleBufferQueue loc_bufq; //定義音效格式參數 SLDataFormat_PCM format_pcm; //創建均衡器對象 const SLInterfaceID eq_ids[1] = {SL_IID_EQUALIZER}; const SLboolean eq_req[1] = {SL_BOOLEAN_TRUE}; (*engine)->CreateAudioPlayer(engine,&pEqualizerObj, &loc_bufq, &format_pcm, 1, eq_ids,eq_req); //realize均衡器對象 (*pEqualizerObj)->Realize(pEqualizerObj, SL_BOOLEAN_FALSE); //獲取均衡器接口 (*pEqualizerObj)->GetInterface(pEqualizerObj,SL_IID_EQUALIZER,&pEqualizer); //通過均衡器接口進行初始化均衡器對象 (*pEqualizer)->SetEnabled(pEqualizer, SL_BOOLEAN_TRUE);
四、總結
OpenSL ES作為專為多媒體應用開發而設計的音頻編程接口,具有低延遲、跨平台、高效性等諸多優點。在Android平台中,OpenSL ES被廣泛地應用於音頻的播放、錄製、處理等多個方面,為移動設備的多媒體應用開發提供了很大的便利。
原創文章,作者:NWRMC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/361617.html