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
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播放音频卡顿时,可能涉及以下原因:
-
音频缓冲区设置不当:ohaudio native的缓冲区大小直接影响音频播放的流畅性。如果缓冲区过小,可能导致音频数据未能及时填充,造成卡顿。可以通过调整缓冲区大小来优化。
-
音频采样率不匹配:音频数据的采样率与设备的硬件支持不匹配时,可能导致播放卡顿。确保音频文件的采样率与设备的硬件支持一致。
-
线程优先级问题:音频播放线程的优先级可能过低,导致在系统资源紧张时被抢占,从而引发卡顿。可以尝试提高音频播放线程的优先级。
-
音频解码性能不足:如果音频解码过程占用过多CPU资源,可能导致播放卡顿。优化解码算法或使用硬件加速解码可以改善这一问题。
-
系统资源竞争:系统中其他高优先级任务或进程可能占用大量资源,导致音频播放受到影响。检查系统资源使用情况,确保音频播放有足够的资源。
-
设备硬件限制:部分设备的硬件性能可能不足以支持高码率或高采样率的音频播放。在这种情况下,降低音频质量或选择更适合的音频格式可能有助于缓解卡顿。
-
ohaudio native API使用不当:检查ohaudio native API的调用是否正确,确保音频数据填充、播放控制等操作无误。
通过以上几个方面的排查和优化,可以有效减少或解决ohaudio native播放音频卡顿的问题。
在HarmonyOS鸿蒙Next中使用ohaudio native播放音频时出现卡顿,可能由以下原因导致:
- 资源占用过高:检查CPU和内存使用情况,确保系统资源充足。
- 音频缓冲区设置不当:调整音频缓冲区大小,确保数据流稳定。
- 线程优先级问题:确保音频播放线程具有较高优先级,避免被其他任务抢占。
- 硬件性能限制:确认设备硬件是否满足音频播放的需求。
- 音频编码格式:检查音频文件编码格式,确保与ohaudio native兼容。
建议逐步排查上述问题,优化代码和系统配置。