OpenSL?ES 全稱為 Open?Sound?Library?for?Embedded?Systems,是一個嵌入式、跨平臺、免費的音頻處理庫。為嵌入式移動多媒體設(shè)備上的應(yīng)用開發(fā)者提供標準化、高性能、低延遲的 API。HarmonyOS 的 Native?API 基于Khronos?Group開發(fā)的OpenSL?ES?1.0.1?API?規(guī)范實現(xiàn),開發(fā)者可以通過<OpenSLES.h>和<OpenSLES_OpenHarmony.h>在 HarmonyOS 上使用相關(guān) API。
HarmonyOS 上的 OpenSL?ES
OpenSL?ES 中提供了以下的接口,HarmonyOS 當前僅實現(xiàn)了部分OpenSL?ES接口,可以實現(xiàn)音頻播放的基礎(chǔ)功能。
調(diào)用未實現(xiàn)接口后會返回 SL_RESULT_FEATURE_UNSUPPORTED,當前沒有相關(guān)擴展可以使用。
以下列表列舉了 HarmonyOS 上已實現(xiàn)的 OpenSL?ES 的接口,具體說明請參考OpenSL?ES規(guī)范:
●?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.? 配置播放器信息,創(chuàng)建 AudioPlayer。
SLDataLocator_BufferQueue?slBufferQueue?=?{
????SL_DATALOCATOR_BUFFERQUEUE,
????0
};
//?具體參數(shù)需要根據(jù)音頻文件格式進行適配
SLDataFormat_PCM?pcmFormat?=?{
????SL_DATAFORMAT_PCM,
????2, //?通道數(shù)
????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 回調(diào)。
static?void?BufferQueueCallback?(SLOHBufferQueueItf?bufferQueueItf,?void?*pContext,?SLuint32?size)
{
????SLuint8?*buffer?=?nullptr;
????SLuint32?pSize;
(*bufferQueueItf)->GetBuffer(bufferQueueItf,?&buffer,?&pSize);
//?將待播放音頻數(shù)據(jù)寫入buffer
(*bufferQueueItf)->Enqueue(bufferQueueItf,?buffer,?size);
}
void?*pContext; //?可傳入自定義的上下文信息,會在Callback內(nèi)收到
(*bufferQueueItf)->RegisterCallback(bufferQueueItf,?BufferQueueCallback,?pContext);
7.? 獲取接口 SL_PLAYSTATE_PLAYING 的 playItf 實例,開始播放。文章來源:http://www.zghlxwxcb.cn/news/detail-774000.html
SLPlayItf?playItf?=?nullptr;
(*pcmPlayerObject)->GetInterface(pcmPlayerObject,?SL_IID_PLAY,?&playItf);
(*playItf)->SetPlayState(playItf,?SL_PLAYSTATE_PLAYING);
8.? 結(jié)束音頻播放。文章來源地址http://www.zghlxwxcb.cn/news/detail-774000.html
(*playItf)->SetPlayState(playItf,?SL_PLAYSTATE_STOPPED);
(*pcmPlayerObject)->Destroy(pcmPlayerObject);
(*engineObject)->Destroy(engineObject);
到了這里,關(guān)于HarmonyOS 音頻開發(fā)指導(dǎo):使用 OpenSL ES 開發(fā)音頻播放功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!