目录

如何优化OHAudio音频播放卡顿的问题

问题现象

使用OHAudio native播放单声道采样为8000的单声道音频PCM,出现卡顿现象。

问题代码示例参考如下:

int32_t writeAudioData(OH_AudioRenderer* renderer, void* context, void* buffer, int32_t length){
  Audio* pAudio = (Audio*)context;
  AVData aVData;
  if (pAudio->pQueue->Pop(aVData)) {
    memcpy(buffer, aVData.frameBuffer, aVData.size);
    length = aVData.size;
    OH_LOG_INFO(LOG_APP, "这里播放音频length:%{public}d", length);
  }
  return 0;
}

背景知识

OHAudio是系统在API version 10中引入的一套C API,此API在设计上实现归一,同时支持普通音频通路和低时延通路。仅支持PCM格式,适用于依赖Native层实现音频输出功能的场景。

在设置音频回调函数时API version 12新增回调函数OH_AudioRenderer_OnWriteDataCallback用于写入音频数据。

问题定位

检查OH_AudioData_Callback_Result (*OH_AudioRenderer_OnWriteDataCallback)(OH_AudioRenderer* renderer, void* userData,void* audioData, int32_t audioDataSize)回调中往audioData中所填待播放数据长度是否是audioDataSize。

分析结论

缓存区间长度audioDataSize较大导致往audioData中所填待播放数据长度小于audioDataSize。过大的buffer会导致声音延迟增加,或者在所填充数据不足audioDataSize时出现噪音。

修改建议