diff --git a/zh-cn/application-dev/media/Readme-CN.md b/zh-cn/application-dev/media/Readme-CN.md index 71f0e59151d342ac3cce3b450775ec9eae2563b7..0cd436d9614e6992161dd147d382fcbac638b28a 100755 --- a/zh-cn/application-dev/media/Readme-CN.md +++ b/zh-cn/application-dev/media/Readme-CN.md @@ -6,7 +6,7 @@ - [音频录制开发指导](audio-recorder.md) - [音频渲染开发指导](audio-renderer.md) - [音频采集开发指导](audio-capturer.md) - - [音频录制开发指导](opensles-capture.md) + - [OpenSL ES录音开发指导](opensles-capture.md) - 视频 - [视频播放开发指导](video-playback.md) diff --git a/zh-cn/application-dev/media/opensles-capture.md b/zh-cn/application-dev/media/opensles-capture.md index b32451caf30f31c03e7a26968eea3211ddf46777..50a80fea83bb9f3f03b0eae7fcd8745e9c48baa7 100644 --- a/zh-cn/application-dev/media/opensles-capture.md +++ b/zh-cn/application-dev/media/opensles-capture.md @@ -1,8 +1,9 @@ -# OpenSL ES音频播放开发指导 +# OpenSL ES音频录制开发指导 ## 场景介绍 -OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的硬件音频加速API。 +开发者可以通过本文了解到在**OpenHarmony**如何使用**OpenSL ES**进行录音相关操作;当前仅实现了部分[**OpenSL ES**接口] +(https://gitee.com/openharmony/third_party_opensles/blob/master/api/1.0.1/OpenSLES.h),未实现接口调用后会返回**SL_RESULT_FEATURE_UNSUPPORTED** @@ -10,7 +11,15 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 以下步骤描述了在**OpenHarmony**如何使用 **OpenSL ES** 开发音频录音功能: -1. 使用 **slCreateEngine** 接口创建引擎对象和实例化引擎对象 **engine**。 +1. 添加头文件 + + ```c++ + #include + #include + #include + ``` + +2. 使用 **slCreateEngine** 接口创建引擎对象和实例化引擎对象 **engine**。 ```c++ SLObjectItf engineObject = nullptr; @@ -20,7 +29,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 -2. 获取接口 **SL_IID_ENGINE** 的引擎接口 **engineEngine** 实例 +3. 获取接口 **SL_IID_ENGINE** 的引擎接口 **engineEngine** 实例 ```c++ SLEngineItf engineItf = nullptr; @@ -29,7 +38,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 -3. 配置录音器信息(配置输入源audiosource、输出源audiosink),创建录音对象**pcmCapturerObject** 。 +4. 配置录音器信息(配置输入源audiosource、输出源audiosink),创建录音对象**pcmCapturerObject** 。 ```c++ SLDataLocator_IODevice io_device = { @@ -59,6 +68,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 0, 0 }; + SLDataSink audioSink = { &buffer_queue, &format_pcm @@ -70,14 +80,14 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 (*pcmCapturerObject)->Realize(pcmCapturerObject, SL_BOOLEAN_FALSE); ``` -4. 获取录音接口**SL_IID_RECORD** 的 **recordItf** 接口实例 +5. 获取录音接口**SL_IID_RECORD** 的 **recordItf** 接口实例 ``` SLRecordItf recordItf; (*pcmCapturerObject)->GetInterface(pcmCapturerObject, SL_IID_RECORD, &recordItf); ``` -5. 获取接口 **SL_IID_OH_BUFFERQUEUE** 的 **bufferQueueItf** 实例 +6. 获取接口 **SL_IID_OH_BUFFERQUEUE** 的 **bufferQueueItf** 实例 ``` SLOHBufferQueueItf bufferQueueItf; @@ -86,12 +96,12 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 -6. 注册 **BuqqerQueueCallback** 回调 +7. 注册 **BuqqerQueueCallback** 回调 ```c++ - static void BuqqerQueueCallback(SLOHBufferQueueItf bufferQueueItf, void *pContext, SLuint32 size) + static void BufferQueueCallback(SLOHBufferQueueItf bufferQueueItf, void *pContext, SLuint32 size) { - AUDIO_INFO_LOG("BuqqerQueueCallback"); + AUDIO_INFO_LOG("BufferQueueCallback"); FILE *wavFile = (FILE *)pContext; if (wavFile != nullptr) { SLuint8 *buffer = nullptr; @@ -107,12 +117,11 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 } //wavFile_ 需要设置为用户想要播放的文件描述符 - (*bufferQueueItf)->RegisterCallback(bufferQueueItf, BuqqerQueueCallback, wavFile_); + (*bufferQueueItf)->RegisterCallback(bufferQueueItf, BufferQueueCallback, wavFile_); ``` - -7. 开始录音 +8. 开始录音 ```c++ static void CaptureStart(SLRecordItf recordItf, SLOHBufferQueueItf bufferQueueItf, FILE *wavFile) @@ -128,7 +137,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 fwrite(buffer, 1, pSize, wavFile); (*bufferQueueItf)->Enqueue(bufferQueueItf, buffer, pSize); } else { - AUDIO_INFO_LOG("BuqqerQueueCallback, buffer is null or pSize: %{public}lu.", pSize); + AUDIO_INFO_LOG("CaptureStart, buffer is null or pSize: %{public}lu.", pSize); } } @@ -136,16 +145,20 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 } ``` - -7. 结束录音 +9. 结束录音 ```c++ - (*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_STOPPED); - (*pcmCapturerObject)->Destroy(pcmCapturerObject); - (*engineObject)->Destroy(engineObject); - fclose(wavFile_); - wavFile_ = nullptr; + static void CaptureStop(SLRecordItf recordItf) + { + AUDIO_INFO_LOG("Enter CaptureStop"); + fflush(wavFile_); + (*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_STOPPED); + (*pcmCapturerObject)->Destroy(pcmCapturerObject); + fclose(wavFile_); + wavFile_ = nullptr; + return; + } ``` diff --git a/zh-cn/application-dev/reference/native-apis/OpenSLES_OpenHarmony.md b/zh-cn/application-dev/reference/native-apis/OpenSLES_OpenHarmony.md index 4d85994f6474dbd1885e5ace12bf756e10721f4d..1c0c400d11ceafb8bf5b1519c9db8e740dbab856 100644 --- a/zh-cn/application-dev/reference/native-apis/OpenSLES_OpenHarmony.md +++ b/zh-cn/application-dev/reference/native-apis/OpenSLES_OpenHarmony.md @@ -11,8 +11,23 @@ ### Functions | Function | Description | | -------- | -------- | -| SLresult (*Enqueue)(SLOHBufferQueueItf self, const void *buffer, SLuint32 size) | 将保存玩录音数据后的buffer加入空闲的buffer队列 | +| SLresult (*Enqueue)(SLOHBufferQueueItf self, const void *buffer, SLuint32 size) | 将保存完录音数据后的buffer加入空闲的buffer队列 | | SLresult (*Clear) (SLOHBufferQueueItf self) | 录音结束后销毁BufferQueue接口对象 | -| SLresult (*GetState) (SLOHBufferQueueItf self, SLOHBufferQueueState *state) | 获取buffer的状态 | | SLresult (*GetBuffer) (SLOHBufferQueueItf self, SLuint8** buffer, SLuint32& size) | 获取从输入设备存入录音数据的buffer | -| SLresult (*RegisterCallback) (SLOHBufferQueueItf self, SlOHBufferQueueCallback callback, void* pContext) | 注册读取音频数据的回调函数 | \ No newline at end of file +| SLresult (*RegisterCallback) (SLOHBufferQueueItf self, SlOHBufferQueueCallback callback, void* pContext) | 注册读取音频数据的回调函数 | + + + +### **Details** +如下是对以上接口函数形参的解释 + | Function | Parameter introduction | +| -------- | -------- | +| Enqueue() | SLOHBufferQueueItf self :BufferQueue接口对象; const void *buffer: 使用后的空闲buffer; SLuint32 size:buffer 长度; | +| Clear() | SLOHBufferQueueItf self :BufferQueue接口对象; | +| GetBuffer() | SLOHBufferQueueItf self :BufferQueue接口对象; SLuint8** buffer: 获取带有录音数据的buffer; SLuint32& size:buffer 长度; | +| RegisterCallback() | SLOHBufferQueueItf self :BufferQueue接口对象; SlOHBufferQueueCallback callback: 回调函数; void* pContext: 录音文件; | + + +### **Third party reference** + +[接口函数使用详情参考](https://gitee.com/openharmony/third_party_opensles/blob/master/api/1.0.1/OpenSLES.h) \ No newline at end of file