提交 3999b6b0 编写于 作者: L liuyuehua1

Reference file improvement.

Signed-off-by: Nliuyuehua1 <liuyuehua1@huawei.com>
上级 f5eaab9a
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
- [音频录制开发指导](audio-recorder.md) - [音频录制开发指导](audio-recorder.md)
- [音频渲染开发指导](audio-renderer.md) - [音频渲染开发指导](audio-renderer.md)
- [音频采集开发指导](audio-capturer.md) - [音频采集开发指导](audio-capturer.md)
- [音频录制开发指导](opensles-capture.md) - [OpenSL ES录音开发指导](opensles-capture.md)
- 视频 - 视频
- [视频播放开发指导](video-playback.md) - [视频播放开发指导](video-playback.md)
......
# 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™ 是无授权费、跨平台、针对嵌入式系统精心优化的 ...@@ -10,7 +11,15 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的
以下步骤描述了在**OpenHarmony**如何使用 **OpenSL ES** 开发音频录音功能: 以下步骤描述了在**OpenHarmony**如何使用 **OpenSL ES** 开发音频录音功能:
1. 使用 **slCreateEngine** 接口创建引擎对象和实例化引擎对象 **engine** 1. 添加头文件
```c++
#include <OpenSLES.h>
#include <OpenSLES_OpenHarmony.h>
#include <OpenSLES_Platform.h>
```
2. 使用 **slCreateEngine** 接口创建引擎对象和实例化引擎对象 **engine**
```c++ ```c++
SLObjectItf engineObject = nullptr; SLObjectItf engineObject = nullptr;
...@@ -20,7 +29,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 ...@@ -20,7 +29,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的
2. 获取接口 **SL_IID_ENGINE** 的引擎接口 **engineEngine** 实例 3. 获取接口 **SL_IID_ENGINE** 的引擎接口 **engineEngine** 实例
```c++ ```c++
SLEngineItf engineItf = nullptr; SLEngineItf engineItf = nullptr;
...@@ -29,7 +38,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 ...@@ -29,7 +38,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的
3. 配置录音器信息(配置输入源audiosource、输出源audiosink),创建录音对象**pcmCapturerObject** 4. 配置录音器信息(配置输入源audiosource、输出源audiosink),创建录音对象**pcmCapturerObject**
```c++ ```c++
SLDataLocator_IODevice io_device = { SLDataLocator_IODevice io_device = {
...@@ -59,6 +68,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 ...@@ -59,6 +68,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的
0, 0,
0 0
}; };
SLDataSink audioSink = { SLDataSink audioSink = {
&buffer_queue, &buffer_queue,
&format_pcm &format_pcm
...@@ -70,14 +80,14 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 ...@@ -70,14 +80,14 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的
(*pcmCapturerObject)->Realize(pcmCapturerObject, SL_BOOLEAN_FALSE); (*pcmCapturerObject)->Realize(pcmCapturerObject, SL_BOOLEAN_FALSE);
``` ```
4. 获取录音接口**SL_IID_RECORD****recordItf** 接口实例 5. 获取录音接口**SL_IID_RECORD****recordItf** 接口实例
``` ```
SLRecordItf recordItf; SLRecordItf recordItf;
(*pcmCapturerObject)->GetInterface(pcmCapturerObject, SL_IID_RECORD, &recordItf); (*pcmCapturerObject)->GetInterface(pcmCapturerObject, SL_IID_RECORD, &recordItf);
``` ```
5. 获取接口 **SL_IID_OH_BUFFERQUEUE****bufferQueueItf** 实例 6. 获取接口 **SL_IID_OH_BUFFERQUEUE****bufferQueueItf** 实例
``` ```
SLOHBufferQueueItf bufferQueueItf; SLOHBufferQueueItf bufferQueueItf;
...@@ -86,12 +96,12 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 ...@@ -86,12 +96,12 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的
6. 注册 **BuqqerQueueCallback** 回调 7. 注册 **BuqqerQueueCallback** 回调
```c++ ```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; FILE *wavFile = (FILE *)pContext;
if (wavFile != nullptr) { if (wavFile != nullptr) {
SLuint8 *buffer = nullptr; SLuint8 *buffer = nullptr;
...@@ -107,12 +117,11 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 ...@@ -107,12 +117,11 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的
} }
//wavFile_ 需要设置为用户想要播放的文件描述符 //wavFile_ 需要设置为用户想要播放的文件描述符
(*bufferQueueItf)->RegisterCallback(bufferQueueItf, BuqqerQueueCallback, wavFile_); (*bufferQueueItf)->RegisterCallback(bufferQueueItf, BufferQueueCallback, wavFile_);
``` ```
7. 开始录音 8. 开始录音
```c++ ```c++
static void CaptureStart(SLRecordItf recordItf, SLOHBufferQueueItf bufferQueueItf, FILE *wavFile) static void CaptureStart(SLRecordItf recordItf, SLOHBufferQueueItf bufferQueueItf, FILE *wavFile)
...@@ -128,7 +137,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的 ...@@ -128,7 +137,7 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的
fwrite(buffer, 1, pSize, wavFile); fwrite(buffer, 1, pSize, wavFile);
(*bufferQueueItf)->Enqueue(bufferQueueItf, buffer, pSize); (*bufferQueueItf)->Enqueue(bufferQueueItf, buffer, pSize);
} else { } 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™ 是无授权费、跨平台、针对嵌入式系统精心优化的 ...@@ -136,16 +145,20 @@ OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的
} }
``` ```
7. 结束录音 9. 结束录音
```c++ ```c++
(*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_STOPPED); static void CaptureStop(SLRecordItf recordItf)
(*pcmCapturerObject)->Destroy(pcmCapturerObject); {
(*engineObject)->Destroy(engineObject); AUDIO_INFO_LOG("Enter CaptureStop");
fclose(wavFile_); fflush(wavFile_);
wavFile_ = nullptr; (*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_STOPPED);
(*pcmCapturerObject)->Destroy(pcmCapturerObject);
fclose(wavFile_);
wavFile_ = nullptr;
return;
}
``` ```
......
...@@ -11,8 +11,23 @@ ...@@ -11,8 +11,23 @@
### Functions ### Functions
| Function | Description | | 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 (*Clear) (SLOHBufferQueueItf self) | 录音结束后销毁BufferQueue接口对象 |
| SLresult (*GetState) (SLOHBufferQueueItf self, SLOHBufferQueueState *state) | 获取buffer的状态 |
| SLresult (*GetBuffer) (SLOHBufferQueueItf self, SLuint8** buffer, SLuint32& size) | 获取从输入设备存入录音数据的buffer | | SLresult (*GetBuffer) (SLOHBufferQueueItf self, SLuint8** buffer, SLuint32& size) | 获取从输入设备存入录音数据的buffer |
| SLresult (*RegisterCallback) (SLOHBufferQueueItf self, SlOHBufferQueueCallback callback, void* pContext) | 注册读取音频数据的回调函数 | | SLresult (*RegisterCallback) (SLOHBufferQueueItf self, SlOHBufferQueueCallback callback, void* pContext) | 注册读取音频数据的回调函数 |
\ No newline at end of file
### **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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册