W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
OpenSL ES全稱為Open Sound Library for Embedded Systems,是一個嵌入式、跨平臺、免費的音頻處理庫。為嵌入式移動多媒體設備上的應用開發(fā)者提供標準化、高性能、低延遲的API。HarmonyOS的Native API基于Khronos Group開發(fā)的OpenSL ES 1.0.1 API 規(guī)范實現(xiàn),開發(fā)者可以通過<OpenSLES.h>和<OpenSLES_OpenHarmony.h>在HarmonyOS上使用相關API。
OpenSL ES中提供了以下的接口,HarmonyOS當前僅實現(xiàn)了部分OpenSL ES接口,可以實現(xiàn)音頻錄制的基礎功能。
調用未實現(xiàn)接口后會返回SL_RESULT_FEATURE_UNSUPPORTED,當前沒有相關擴展可以使用。
以下列表列舉了HarmonyOS上已實現(xiàn)的OpenSL ES的接口,具體說明請參考OpenSL ES規(guī)范:
接口 | 說明 |
---|---|
SLresult (*Enqueue) (SLOHBufferQueueItf self, const void *buffer, SLuint32 size) | 根據(jù)情況將buffer加到相應隊列中。 如果是播放操作,則將帶有音頻數(shù)據(jù)的buffer插入到filledBufferQ_隊列中;如果是錄音操作,則將錄音使用后的空閑buffer插入到freeBufferQ_隊列中。 self:表示調用該函數(shù)的BufferQueue接口對象。 buffer:播放時表示帶有音頻數(shù)據(jù)的buffer,錄音時表示已存儲完錄音數(shù)據(jù)后的空閑buffer。 size:表示buffer的大小。 |
SLresult (*Clear) (SLOHBufferQueueItf self) | 釋放BufferQueue接口對象。 self:表示調用該函數(shù)的BufferQueue接口對象將被釋放。 |
SLresult (*GetState) (SLOHBufferQueueItf self, SLOHBufferQueueState *state) | 獲取BufferQueue接口對象狀態(tài)。 self:表示調用該函數(shù)的BufferQueue接口對象。 state:BufferQueue的當前狀態(tài)。 |
SLresult (*RegisterCallback) (SLOHBufferQueueItf self, SlOHBufferQueueCallback callback, void* pContext) | 注冊回調函數(shù)。 self:表示調用該函數(shù)的BufferQueue接口對象。 callback:播放/錄音時注冊的回調函數(shù)。 pContext:播放時傳入待播放音頻文件,錄音時傳入將要錄制的音頻文件。 |
SLresult (*GetBuffer) (SLOHBufferQueueItf self, SLuint8** buffer, SLuint32* size) | 根據(jù)情況獲取相應的buffer。 如果是播放操作,則從freeBufferQ_隊列中獲取空閑buffer;如果是錄音操作,則從filledBufferQ_隊列中獲取攜帶錄音數(shù)據(jù)的buffer。 self:表示調用該函數(shù)的BufferQueue接口對象。 buffer:播放時表示空閑的buffer,錄音時表示攜帶錄音數(shù)據(jù)的buffer。 size:表示buffer的大小。 |
參考下列示例代碼,完成音頻錄制。
- #include <OpenSLES.h>
- #include <OpenSLES_OpenHarmony.h>
- #include <OpenSLES_Platform.h>
- SLObjectItf engineObject = nullptr;
- slCreateEngine(&engineObject, 0, nullptr, 0, nullptr, nullptr);
- (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
- SLEngineItf engineItf = nullptr;
- (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineItf);
- SLDataLocator_IODevice io_device = {
- SL_DATALOCATOR_IODEVICE,
- SL_IODEVICE_AUDIOINPUT,
- SL_DEFAULTDEVICEID_AUDIOINPUT,
- NULL
- };
- SLDataSource audioSource = {
- &io_device,
- NULL
- };
- SLDataLocator_BufferQueue buffer_queue = {
- SL_DATALOCATOR_BUFFERQUEUE,
- 3
- };
- // 具體參數(shù)需要根據(jù)音頻文件格式進行適配
- SLDataFormat_PCM format_pcm = {
- SL_DATAFORMAT_PCM, // 輸入的音頻格式
- 1, // 單聲道
- SL_SAMPLINGRATE_44_1, // 采樣率: 44100HZ
- SL_PCMSAMPLEFORMAT_FIXED_16, // 音頻采樣格式,小尾數(shù),帶符號的16位整數(shù)
- 0,
- 0,
- 0
- };
- SLDataSink audioSink = {
- &buffer_queue,
- &format_pcm
- };
- SLObjectItf pcmCapturerObject = nullptr;
- (*engineItf)->CreateAudioRecorder(engineItf, &pcmCapturerObject,
- &audioSource, &audioSink, 0, nullptr, nullptr);
- (*pcmCapturerObject)->Realize(pcmCapturerObject, SL_BOOLEAN_FALSE);
- SLRecordItf recordItf;
- (*pcmCapturerObject)->GetInterface(pcmCapturerObject, SL_IID_RECORD, &recordItf);
- SLOHBufferQueueItf bufferQueueItf;
- (*pcmCapturerObject)->GetInterface(pcmCapturerObject, SL_IID_OH_BUFFERQUEUE, &bufferQueueItf);
- static void BufferQueueCallback(SLOHBufferQueueItf bufferQueueItf, void *pContext, SLuint32 size)
- {
- // 可從pContext獲取注冊時傳入的使用者信息
- SLuint8 *buffer = nullptr;
- SLuint32 pSize = 0;
- (*bufferQueueItf)->GetBuffer(bufferQueueItf, &buffer, &pSize);
- if (buffer != nullptr) {
- // 可從buffer內讀取錄音數(shù)據(jù)進行后續(xù)處理
- (*bufferQueueItf)->Enqueue(bufferQueueItf, buffer, size);
- }
- }
- void *pContext; // 可傳入自定義的上下文信息,會在Callback內收到
- (*bufferQueueItf)->RegisterCallback(bufferQueueItf, BufferQueueCallback, pContext);
- (*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_RECORDING);
- (*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_STOPPED);
- (*pcmCapturerObject)->Destroy(pcmCapturerObject);
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: