【关键字】
音频渲染 / buffer length / OH_AudioDecoder
【问题描述】
实现音视频编解码的音频渲染过程中,通过OH_AudioDecoder得到的buffer数据大小和OH_AudioRenderer_Callbacks::OH_AudioRenderer_OnWriteData这个回调中得到的buffer length不匹配如何处理,是否有demo可以参考。
【解决方案】
buffer length不匹配是正常现象。
处理方式:可以做缓存 或者 用audioRenderer_->Write(destBuffer, destLength);不要用回调,回调一般是给低时延使用的。
比如avplayer示例代码如下:
auto mem=input->memory_;
auto srcBuffer = mem->GetAddr();
auto destBuffer = const_cast<uint8_t *>(srcBuffer);
auto srcLength= mem->GetSize();
size_t destLength= srcLength;
while (isForcePaused_ && seekable_ ==Seekable::SEEKABLE) {
OHOS∷Media∷SleepInJob(5); //5ms
continue;
}
OHOS∷Media::AutoLock lock(renderMutex_);
FALSE RETURN_V(audioRenderer != nullptr,Status∷ERROR_NULL_POINTER);
for(;destLength>0;){
ret= audioRenderer_->Write(destBuffer, destLength);
if(ret<0){
MEDIA_LOG_E("Write data error ret is:" PUBLIC_LOG_D32,ret );
break;
} else if (static_cast<size_t>(ret) < destLength) {
0HOS::Media::SleepInJob(5); //5ms
}
destBuffer += ret;
destLength-=ret;
MEDIA_LOG_DD("written data size " PUBLIC_LOG_D32,ret);
}