一、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-tw/n/361617.html
微信掃一掃
支付寶掃一掃