HarmonyOS音訊開發指導:使用OpenSL ES開發音訊播放功能
OpenSL ES全稱為Open Sound Library for Embedded Systems,是一個嵌入式、跨平臺、免費的音訊處理庫。為嵌入式移動多媒體裝置上的應用開發者提供標準化、高效能、低延遲的API。HarmonyOS的Native API基於 開發的 1.0.1 API 規範實現,開發者可以透過<OpenSLES.h>和<OpenSLES_OpenHarmony.h>在HarmonyOS上使用相關API。
HarmonyOS上的OpenSL ES
OpenSL ES中提供了以下的介面,HarmonyOS當前僅實現了部分 OpenSL ES 介面,可以實現音訊播放的基礎功能。
呼叫未實現介面後會返回 SL_RESULT_FEATURE_UNSUPPORTED,當前沒有相關擴充套件可以使用。
以下列表列舉了HarmonyOS上已實現的OpenSL ES的介面,具體說明請參考 規範:
● 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>使用。
介面 |
說明 |
SLresult (*Enqueue) (SLOHBufferQueueItf self, const void *buffer, SLuint32 size) |
根據情況將buffer加到相應佇列中。 如果是播放操作,則將帶有音訊資料的buffer插入到filledBufferQ_佇列中;如果是錄音操作,則將錄音使用後的空閒buffer插入到freeBufferQ_佇列中。 self:表示呼叫該函式的BufferQueue介面物件。 buffer:播放時表示帶有音訊資料的buffer,錄音時表示已儲存完錄音資料後的空閒buffer。 size:表示buffer的大小。 |
SLresult (*Clear) (SLOHBufferQueueItf self) |
釋放BufferQueue介面物件。 self:表示呼叫該函式的BufferQueue介面物件將被釋放。 |
SLresult (*GetState) (SLOHBufferQueueItf self, SLOHBufferQueueState *state) |
獲取BufferQueue介面物件狀態。 self:表示呼叫該函式的BufferQueue介面物件。 state:BufferQueue的當前狀態。 |
SLresult (*RegisterCallback) (SLOHBufferQueueItf self, SlOHBufferQueueCallback callback, void* pContext) |
註冊回撥函式。 self:表示呼叫該函式的BufferQueue介面物件。 callback:播放/錄音時註冊的回撥函式。 pContext:播放時傳入待播放音訊檔案,錄音時傳入將要錄製的音訊檔案。 |
SLresult (*GetBuffer) (SLOHBufferQueueItf self, SLuint8** buffer, SLuint32* size) |
根據情況獲取相應的buffer。 如果是播放操作,則從freeBufferQ_佇列中獲取空閒buffer;如果是錄音操作,則從filledBufferQ_佇列中獲取攜帶錄音資料的buffer。 self:表示呼叫該函式的BufferQueue介面物件。 buffer:播放時表示空閒的buffer,錄音時表示攜帶錄音資料的buffer。 size:表示buffer的大小。 |
完整示例
參考以下示例程式碼,播放一個音訊檔案。
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. 配置播放器資訊,建立AudioPlayer。
SLDataLocator_BufferQueue slBufferQueue = { SL_DATALOCATOR_BUFFERQUEUE, 0 }; // 具體引數需要根據音訊檔案格式進行適配 SLDataFormat_PCM pcmFormat = { SL_DATAFORMAT_PCM, 2, // 通道數 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回撥。
static void BufferQueueCallback (SLOHBufferQueueItf bufferQueueItf, void *pContext, SLuint32 size) { SLuint8 *buffer = nullptr; SLuint32 pSize; (*bufferQueueItf)->GetBuffer(bufferQueueItf, &buffer, &pSize); // 將待播放音訊資料寫入buffer (*bufferQueueItf)->Enqueue(bufferQueueItf, buffer, size); } void *pContext; // 可傳入自定義的上下文資訊,會在Callback內收到 (*bufferQueueItf)->RegisterCallback(bufferQueueItf, BufferQueueCallback, pContext);
7. 獲取介面SL_PLAYSTATE_PLAYING的playItf例項,開始播放。
SLPlayItf playItf = nullptr; (*pcmPlayerObject)->GetInterface(pcmPlayerObject, SL_IID_PLAY, &playItf); (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_PLAYING);
8. 結束音訊播放。
(*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); (*pcmPlayerObject)->Destroy(pcmPlayerObject); (*engineObject)->Destroy(engineObject);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009402/viewspace-2990825/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HarmonyOS音訊開發指導:使用AudioRenderer開發音訊播放功能音訊
- Android 音視訊開發 - 使用AudioTrack播放音訊Android音訊
- iOS開發系列--音訊播放、錄音、視訊播放、拍照、視訊錄製(轉)iOS音訊
- [FFmpeg + OpenGL + OpenSL ES]音視訊同步- 8
- FFmpeg開發筆記(八):ffmpeg解碼音訊並使用SDL同步音訊播放筆記音訊
- openwrt 音訊開發音訊
- 音訊開發之錄製播放pcm檔案音訊
- 微信小遊戲開發(10)-音訊播放遊戲開發音訊
- 【秒懂音視訊開發】12_播放WAV
- HarmonyOS:NativeWindow 開發指導
- Windows 平臺上有許多開源的音訊開發庫,涵蓋了從簡單的音訊播放到複雜的音訊處理和生成。以下是一些常見且功能強大的開源音訊開發庫:Windows音訊
- 【秒懂音視訊開發】08_音訊錄製音訊
- Android 音視訊開發 視訊編碼,音訊編碼格式Android音訊
- 【秒懂音視訊開發】13_音訊重取樣音訊
- FFmpeg開發筆記(十八)FFmpeg相容各種音訊格式的播放筆記音訊
- HarmonyOS 裝置管理開發:USB 服務開發指導
- HarmonyOS電話服務開發指導
- win10自帶音訊播放在哪裡開啟 win10自帶音訊播放怎麼開啟Win10音訊
- 【秒懂音視訊開發】06_重識聲音
- 一個WPF開發的、介面簡潔漂亮的音訊播放器音訊播放器
- iOS AVAudioPlayer(音訊播放)iOS音訊
- android 音訊播放 SoundPoolAndroid音訊
- HarmonyOS 應用事件打點開發指導事件
- 【音視訊安卓開發 (十一)】Android初級開發(一)安卓Android
- 【秒懂音視訊開發】05_Qt開發基礎QT
- 騰訊音樂招 iOS 開發, base 深圳,要求:本科、三年、OC,懂音視訊開發優先。iOS
- 音視訊開發:為什麼推薦使用Jetpack CameraX?Jetpack
- 音視訊開發著作《Android音視訊開發》終於發售了,先來一波簽名送書福利!Android
- 音視訊開發-全網最全常用音視訊編碼和格式彙總
- 【秒懂音視訊開發】09_音訊錄製02_程式設計音訊程式設計
- 【秒懂音視訊開發】02_Windows開發環境搭建Windows開發環境
- 多功能音訊播放器:foobar2000 for mac音訊播放器Mac
- Flutter(十) 音訊+影片播放Flutter音訊
- hqplayer pro 4,音訊播放音訊
- 《音視訊開發進階指南》讀書筆記(一) —— 音視訊基礎概念筆記
- 音視訊技術開發週刊67期
- 音視訊技術開發週刊65期
- 音視訊技術開發週刊56期