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```