HarmonyOS鸿蒙Next中使用ohaudio native播放音频卡顿

HarmonyOS鸿蒙Next中使用ohaudio native播放音频卡顿 我使用ohaudio native播放单声道采样为8000的单声道音频pcm,声音不正常,一卡一卡的,能否给个数据写入例子看看,或者播放音频的native例子。

#include "Audio.h"
#include "ppcs/AVData.h"
#include <unistd.h>
#include "hilog/log.h"
#undef LOG_TAG
#define LOG_TAG "QN_Audio"

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;
    // free(aVData.frameBuffer);
    OH_LOG_INFO(LOG_APP, "这里播放音频length:%{public}d", length);
  }
  return 0;
}

int32_t onError(OH_AudioRenderer* renderer, void* context, OH_AudioStream_Result error){
  return 0;
}

Audio::Audio(){
  pQueue = new SafeQueue();
  OH_AudioStreamBuilder_Create(&pBuilder, AUDIOSTREAM_TYPE_RENDERER);
  OH_AudioStreamBuilder_SetSamplingRate(pBuilder, 8000);
  OH_AudioStreamBuilder_SetChannelCount(pBuilder, 1);
  OH_AudioStreamBuilder_SetSampleFormat(pBuilder, AUDIOSTREAM_SAMPLE_S16LE);
  OH_AudioStreamBuilder_SetEncodingType(pBuilder, AUDIOSTREAM_ENCODING_TYPE_RAW);
  OH_AudioStreamBuilder_SetRendererInfo(pBuilder, AUDIOSTREAM_USAGE_GAME);
  callBacks.OH_AudioRenderer_OnWriteData = writeAudioData;
  callBacks.OH_AudioRenderer_OnStreamEvent = nullptr;
  callBacks.OH_AudioRenderer_OnInterruptEvent = nullptr;
  callBacks.OH_AudioRenderer_OnError = onError;
  OH_AudioStreamBuilder_SetRendererCallback(pBuilder, callBacks, this);
  OH_AudioStreamBuilder_SetLatencyMode(pBuilder, AUDIOSTREAM_LATENCY_MODE_FAST);
  OH_AudioStreamBuilder_GenerateRenderer(pBuilder, &pAudioRenderer);
}

Audio::~Audio(){
  if(pBuilder){
    OH_AudioStreamBuilder_Destroy(pBuilder);
    pBuilder = nullptr;
  }
  if(pAudioRenderer){
    OH_AudioRenderer_Release(pAudioRenderer);
    pAudioRenderer = nullptr;
  }
}

void Audio::playSound(){
  OH_AudioRenderer_Start(pAudioRenderer);
}

更多关于HarmonyOS鸿蒙Next中使用ohaudio native播放音频卡顿的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

oh_audio参考链接:

https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Native/Audio

注意:调用AudioRendererOnWriteData函数的时候,除了最后一帧可能数据不够,其他建议写满,数据不足bufferLen时,填充空数据即可避免杂音。

更多关于HarmonyOS鸿蒙Next中使用ohaudio native播放音频卡顿的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中使用ohaudio native播放音频卡顿时,可能涉及以下原因:

  1. 音频缓冲区设置不当:ohaudio native的缓冲区大小直接影响音频播放的流畅性。如果缓冲区过小,可能导致音频数据未能及时填充,造成卡顿。可以通过调整缓冲区大小来优化。

  2. 音频采样率不匹配:音频数据的采样率与设备的硬件支持不匹配时,可能导致播放卡顿。确保音频文件的采样率与设备的硬件支持一致。

  3. 线程优先级问题:音频播放线程的优先级可能过低,导致在系统资源紧张时被抢占,从而引发卡顿。可以尝试提高音频播放线程的优先级。

  4. 音频解码性能不足:如果音频解码过程占用过多CPU资源,可能导致播放卡顿。优化解码算法或使用硬件加速解码可以改善这一问题。

  5. 系统资源竞争:系统中其他高优先级任务或进程可能占用大量资源,导致音频播放受到影响。检查系统资源使用情况,确保音频播放有足够的资源。

  6. 设备硬件限制:部分设备的硬件性能可能不足以支持高码率或高采样率的音频播放。在这种情况下,降低音频质量或选择更适合的音频格式可能有助于缓解卡顿。

  7. ohaudio native API使用不当:检查ohaudio native API的调用是否正确,确保音频数据填充、播放控制等操作无误。

通过以上几个方面的排查和优化,可以有效减少或解决ohaudio native播放音频卡顿的问题。

在HarmonyOS鸿蒙Next中使用ohaudio native播放音频时出现卡顿,可能由以下原因导致:

  1. 资源占用过高:检查CPU和内存使用情况,确保系统资源充足。
  2. 音频缓冲区设置不当:调整音频缓冲区大小,确保数据流稳定。
  3. 线程优先级问题:确保音频播放线程具有较高优先级,避免被其他任务抢占。
  4. 硬件性能限制:确认设备硬件是否满足音频播放的需求。
  5. 音频编码格式:检查音频文件编码格式,确保与ohaudio native兼容。

建议逐步排查上述问题,优化代码和系统配置。

回到顶部