跳到主要内容

低时延音频录制(C/C++)

从API version 10开始支持低时延音频录制。

低时延音频录制是一种通过软硬芯协同设计实现的音频渲染方案。其核心机制是通过减少buffer大小、优化读写数据架构,使该模式下音频录制具有更低的时延。

使用前提

开发指导

以下各步骤示例为片段代码,可通过示例代码右下方链接获取完整示例

简介

为使用低时延模式,开发者需要参考推荐使用OHAudio开发音频录制功能(C/C++)进行音频开发。

当前OHAudio支持两种模式:普通模式(AUDIOSTREAM_LATENCY_MODE_NORMAL)和低时延模式(AUDIOSTREAM_LATENCY_MODE_FAST)。

设置低时延模式

开发者通过调用OH_AudioStreamBuilder_SetLatencyMode(),设置OH_AudioStream_LatencyMode来决定音频流使用的模式。

设置低时延模式开发示例:

OH_AudioStream_LatencyMode latencyMode = AUDIOSTREAM_LATENCY_MODE_FAST;
OH_AudioStreamBuilder_SetLatencyMode(builder, latencyMode);

针对OHAudio开发音频录制,有以下相关实例可供参考:

注意事项

低时延模式限制

在以下场景中,即使设置了低时延模式,系统仍会使用普通模式。

  • 当前设备不支持低时延模式。
  • 当前流格式不支持低时延模式。
  • 系统低时延资源已被全部占用。
  • 当前系统中存在更高优先级流(如:VOIP通话)。

从API version 20开始,支持低时延相关查询接口。

使用低时延流的场景

  • k歌、直播等对时延要求较高的场景,建议使用低时延模式。
  • 普通录音、录像、录屏等没有实时要求的场景,不建议使用低时延模式。

确保数据及时读入

低时延模式下,应用读取数据的频次比普通录制模式高,如果获取数据不及时可能导致杂音等问题。开发者应避免在数据回调线程中做耗时操作,确保数据回调线程可以及时返回。

数据回调线程

音频录制的音频数据需要通过回调接口读入。开发者要实现回调接口,使用OH_AudioStreamBuilder_SetCapturerReadDataCallback设置回调函数,在设置音频回调函数时,回调函数OH_AudioCapturer_OnReadDataCallback(从API version 12开始支持)用于读取音频数据。

开发音频录制功能的示例代码请参考:推荐使用OHAudio开发音频录制功能(C/C++)

设置数据回调函数示例:

int32_t MyOnReadData_Legacy(
OH_AudioCapturer* capturer,
void* userData,
void* buffer,
int32_t length)
{
// 从buffer中取出length长度的录音数据。
return 0;
}
// ...
// 配置读入音频数据回调函数。
OH_AudioCapturer_OnReadDataCallback readDataCb = MyOnReadData_NewAPI;
OH_AudioStreamBuilder_SetCapturerReadDataCallback(builder, readDataCb, nullptr);
  • 为避免音频卡顿,禁止在回调方法OH_AudioCapturer_OnReadData中执行耗时操作。

  • 为保证OH_AudioCapturer_OnReadData与流状态控制逻辑独立正常运行,禁止在OH_AudioCapturer_OnReadData回调方法中调用音频流控制接口。

    音频流控制接口说明
    OH_AudioStream_Result OH_AudioCapturer_Start(OH_AudioCapturer* capturer)开始录制。
    OH_AudioStream_Result OH_AudioCapturer_Pause(OH_AudioCapturer* capturer)暂停录制。
    OH_AudioStream_Result OH_AudioCapturer_Stop(OH_AudioCapturer* capturer)停止录制。
    OH_AudioStream_Result OH_AudioCapturer_Flush(OH_AudioCapturer* capturer)释放缓存数据。
    OH_AudioStream_Result OH_AudioCapturer_Release(OH_AudioCapturer* capturer)释放录制实例。

    音频流控制接口执行会有耗时(例如OH_AudioCapturer_Stop接口单次执行普遍超过50ms),应避免在主线程中直接调用,以免造成界面显示卡顿。