• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 实现音频耳返
2<!--Kit: Audio Kit-->
3<!--Subsystem: Multimedia-->
4<!--Owner: @songshenke-->
5<!--Designer: @caixuejiang; @hao-liangfei; @zhanganxiang-->
6<!--Tester: @Filger-->
7<!--Adviser: @zengyawen-->
8
9实现音频耳返的功能,可将音频实时传输到耳机中,让用户可以实时听到自己或者其他相关声音。
10
11常用于K歌类应用,将录制的人声和背景音乐实时送到耳机中,使用户通过反馈即时调整,获得更好的使用体验。
12
13## 使用前提
14
15- 开发者可使用OHAudio提供的播放和录制能力相结合,将录制获取的音频数据作为播放的音频输入,实现耳返功能。
16
17  实现参考[使用OHAudio开发音频播放功能](using-ohaudio-for-playback.md)、[使用OHAudio开发音频录制功能](using-ohaudio-for-recording.md)。
18
19- 当前仅支持通过有线耳机实现耳返功能。音频由有线耳机采集并播放。
20
21## 开发指导
22
23### 创建音频录制
24
25通过OHAudio提供OH_AudioStreamBuilder接口,遵循构造器设计模式,构建录制音频流。指定对应的[OH_AudioStream_Type](../../reference/apis-audio-kit/capi-native-audiostream-base-h.md#oh_audiostream_type), 设置为AUDIOSTREAM_TYPE_CAPTURER。
26
27```cpp
28OH_AudioStreamBuilder* builder;
29OH_AudioStreamBuilder_Create(&builder, AUDIOSTREAM_TYPE_CAPTURER);
30```
31
32### 创建音频播放
33
34通过OHAudio提供OH_AudioStreamBuilder接口,遵循构造器设计模式,构建播放音频流。指定对应的[OH_AudioStream_Type](../../reference/apis-audio-kit/capi-native-audiostream-base-h.md#oh_audiostream_type), AUDIOSTREAM_TYPE_RENDERER。
35
36```cpp
37OH_AudioStreamBuilder* builder;
38OH_AudioStreamBuilder_Create(&builder, AUDIOSTREAM_TYPE_RENDERER);
39```
40
41### 设置低时延模式
42
43为了实现更好的耳返功能,需要使得音频从录制到播放保持较低的时延,当设备支持低时延通路时,开发者需要使用低时延模式来进行录制和播放。
44
45在创建音频录制构造器时调用[OH_AudioStreamBuilder_SetLatencyMode()](../../reference/apis-audio-kit/capi-native-audiostreambuilder-h.md#oh_audiostreambuilder_setlatencymode)设置低时延模式,播放和录制均按如下方式设置为低时延模式。
46
47```cpp
48OH_AudioStream_LatencyMode latencyMode = AUDIOSTREAM_LATENCY_MODE_FAST;
49OH_AudioStreamBuilder_SetLatencyMode(builder, latencyMode);
50```
51
52为实现实时耳返功能,需创建一个公共缓存区用于存储录制的数据,并及时从该缓存区获取数据写入播放构造器。
53
54### 定义公共缓存和录制、播放函数
55
56```cpp
57// 创建一块公共缓存BUFFER,用于及时写入录制录制和读取播放数据
58
59// 自定义读入录制数据函数。
60    int32_t MyOnReadData(
61        OH_AudioCapturer* capturer,
62        void* userData,
63        void* buffer,
64        int32_t length)
65    {
66        // 从buffer中取出length长度的录音数据,放在创建好的公共缓存BUFFER中,用于供renderer进行读取
67        return 0;
68    }
69
70    // 自定义写入数据函数。
71    int32_t MyOnWriteData(
72        OH_AudioRenderer* renderer,
73        void* userData,
74        void* buffer,
75        int32_t length)
76    {
77        // 从公共缓存BUFFER中读取数据,并按length长度写入buffer。
78        return 0;
79    }
80```
81
82### 设置音频流参数
83
84以录制流参数设置为例:
85
86```cpp
87// 设置音频采样率。
88OH_AudioStreamBuilder_SetSamplingRate(builder, 48000);
89// 设置音频声道。
90OH_AudioStreamBuilder_SetChannelCount(builder, 2);
91// 设置音频采样格式。
92OH_AudioStreamBuilder_SetSampleFormat(builder, AUDIOSTREAM_SAMPLE_S16LE);
93// 设置音频流的编码类型。
94OH_AudioStreamBuilder_SetEncodingType(builder, AUDIOSTREAM_ENCODING_TYPE_RAW);
95// 设置输出音频流的工作场景。
96OH_AudioStreamBuilder_SetRendererInfo(builder, AUDIOSTREAM_SOURCE_TYPE_MIC);
97```
98
99对于播放流,除了音频流的工作场景外,其余设置为和录制流相同的参数。
100
101工作场景参数设置如下:
102
103```cpp
104OH_AudioStreamBuilder_SetRendererInfo(builder, AUDIOSTREAM_USAGE_MUSIC);
105```
106
107### 设置录制回调函数
108
109```cpp
110// 自定义读入数据函数。
111int32_t MyOnReadData(
112    OH_AudioCapturer* capturer,
113    void* userData,
114    void* buffer,
115    int32_t length)
116{
117    // 从buffer中取出length长度的录音数据。
118    return 0;
119}
120// 自定义音频流事件函数。
121int32_t MyOnStreamEvent(
122    OH_AudioCapturer* capturer,
123    void* userData,
124    OH_AudioStream_Event event)
125{
126    // 根据event表示的音频流事件信息,更新录制器状态和界面。
127    return 0;
128}
129// 自定义音频中断事件函数。
130int32_t MyOnInterruptEvent(
131    OH_AudioCapturer* capturer,
132    void* userData,
133    OH_AudioInterrupt_ForceType type,
134    OH_AudioInterrupt_Hint hint)
135{
136    // 根据type和hint表示的音频中断信息,更新录制器状态和界面。
137    return 0;
138}
139// 自定义异常回调函数。
140int32_t MyOnError(
141    OH_AudioCapturer* capturer,
142    void* userData,
143    OH_AudioStream_Result error)
144{
145    // 根据error表示的音频异常信息,做出相应的处理。
146    return 0;
147}
148
149OH_AudioCapturer_Callbacks callbacks;
150
151// 配置回调函数。
152callbacks.OH_AudioCapturer_OnReadData = MyOnReadData;
153callbacks.OH_AudioCapturer_OnStreamEvent = MyOnStreamEvent;
154callbacks.OH_AudioCapturer_OnInterruptEvent = MyOnInterruptEvent;
155callbacks.OH_AudioCapturer_OnError = MyOnError;
156
157// 设置音频输入流的回调。
158OH_AudioStreamBuilder_SetCapturerCallback(builder, callbacks, nullptr);
159```
160
161### 设置播放回调函数
162
163```cpp
164    // 自定义写入数据函数。
165    int32_t MyOnWriteData(
166        OH_AudioRenderer* renderer,
167        void* userData,
168        void* buffer,
169        int32_t length)
170    {
171        // 从公共缓存BUFFER中读取数据,并按length长度写入buffer。
172        return 0;
173    }
174    // 自定义音频流事件函数。
175    int32_t MyOnStreamEvent(
176        OH_AudioRenderer* renderer,
177        void* userData,
178        OH_AudioStream_Event event)
179    {
180        // 根据event表示的音频流事件信息,更新播放器状态和界面。
181        return 0;
182    }
183    // 自定义音频中断事件函数。
184    int32_t MyOnInterruptEvent(
185        OH_AudioRenderer* renderer,
186        void* userData,
187        OH_AudioInterrupt_ForceType type,
188        OH_AudioInterrupt_Hint hint)
189    {
190        // 根据type和hint表示的音频中断信息,更新播放器状态和界面。
191        return 0;
192    }
193    // 自定义异常回调函数。
194    int32_t MyOnError(
195        OH_AudioRenderer* renderer,
196        void* userData,
197        OH_AudioStream_Result error)
198    {
199        // 根据error表示的音频异常信息,做出相应的处理。
200        return 0;
201    }
202
203    OH_AudioRenderer_Callbacks callbacks;
204
205    // 配置回调函数。
206    callbacks.OH_AudioRenderer_OnWriteData = MyOnWriteData;
207    callbacks.OH_AudioRenderer_OnStreamEvent = MyOnStreamEvent;
208    callbacks.OH_AudioRenderer_OnInterruptEvent = MyOnInterruptEvent;
209    callbacks.OH_AudioRenderer_OnError = MyOnError;
210
211    // 设置输出音频流的回调。
212    OH_AudioStreamBuilder_SetRendererCallback(builder, callbacks, nullptr);
213
214```
215
216### 构造录制音频流
217
218```cpp
219OH_AudioCapturer* audioCapturer;
220OH_AudioStreamBuilder_GenerateCapturer(builder, &audioCapturer);
221```
222
223### 构造播放音频流
224
225```cpp
226OH_AudioRenderer* audioRenderer;
227OH_AudioStreamBuilder_GenerateRenderer(builder, &audioRenderer);
228```
229
230### 使用音频流
231
232以录制为例,开发者可以使用以下接口控制音频流的开始、暂停、停止和释放。
233
234> **注意:**
235> 在实现耳返功能时,开发者需同时控制录制流和播放流,确保两者同步。
236
237| 接口                                                     | 说明         |
238| ------------------------------------------------------------ | ------------ |
239| OH_AudioStream_Result [OH_AudioRenderer_Start](../../reference/apis-audio-kit/capi-native-audiorenderer-h.md#oh_audiorenderer_start)(OH_AudioRenderer* renderer) | 开始播放。     |
240| OH_AudioStream_Result [OH_AudioRenderer_Pause](../../reference/apis-audio-kit/capi-native-audiorenderer-h.md#oh_audiorenderer_pause)(OH_AudioRenderer* renderer) | 暂停播放。     |
241| OH_AudioStream_Result [OH_AudioRenderer_Stop](../../reference/apis-audio-kit/capi-native-audiorenderer-h.md#oh_audiorenderer_stop)(OH_AudioRenderer* renderer) | 停止播放。     |
242| OH_AudioStream_Result [OH_AudioRenderer_Flush](../../reference/apis-audio-kit/capi-native-audiorenderer-h.md#oh_audiorenderer_flush)(OH_AudioRenderer* renderer) | 释放缓存数据。 |
243| OH_AudioStream_Result [OH_AudioRenderer_Release](../../reference/apis-audio-kit/capi-native-audiorenderer-h.md#oh_audiorenderer_release)(OH_AudioRenderer* renderer) | 释放播放实例。 |
244
245### 释放构造器
246
247构造器不再使用时,采用如下方式释放资源。
248
249```cpp
250OH_AudioStreamBuilder_Destroy(builder);
251```