HarmonyOS鸿蒙Next中audioCapturer录音导致OOM

HarmonyOS鸿蒙Next中audioCapturer录音导致OOM 录制代码,抄的文档上面的

while (1) {
  let bufferSize = await this.audioCapturer.getBufferSize();
  let buffer = await this.audioCapturer.read(bufferSize, true);
  if (buffer === undefined) {
    console.error(`${TAG}: read buffer failed`);
  } else {
    console.info('采集BUFF');
  }
}

半小时后就会导致OOM

Module name:com.dspca.lxm.myapplication
Version:1.0.0Pid:32587
Uid:20040005
Reason:Signal:SIGABRT(SI_QUEUE)@0x0131c94500007f4b from:32587:20040005
LastFatalMessage:
Thread name:com.dspca.lxm.m
#00 pc 0000000000089fcc /vendor/aosp/system/lib64/libc.so(abort+164) (a85ef5fb74e0282813cd1edb10854577)
#01 pc 00000000001028c8 /system/lib64/libc++.so (449f4d1c1743896e487b20ec2b4a9c459e4c9861)
#02 pc 00000000000e1bc4 /system/lib64/libc++.so (449f4d1c1743896e487b20ec2b4a9c459e4c9861)
#03 pc 0000000000100c6c /system/lib64/libc++.so (449f4d1c1743896e487b20ec2b4a9c459e4c9861)
#04 pc 0000000000105e1c /system/lib64/libc++.so (449f4d1c1743896e487b20ec2b4a9c459e4c9861)
#05 pc 0000000000105d6c /system/lib64/libc++.so(__cxa_throw+164) (449f4d1c1743896e487b20ec2b4a9c459e4c9861)
#06 pc 0000000000091800 /system/lib64/libc++.so(std::__1::__throw_system_error(int, char const*)+96) (449f4d1c1743896e487b20ec2b4a9c459e4c9861)
#07 pc 00000000000204ac /system/lib64/libaudio_renderer_gateway.z.so(OHOS::AudioStandard::AudioContainerClientBase::HandleCapturePositionCallbacksGa(unsigned long)+732) (1e6fbb5b47c69a849f44102aac31bf1c)
#08 pc 0000000000020740 /system/lib64/libaudio_renderer_gateway.z.so(OHOS::AudioStandard::AudioContainerClientBase::ReadStreamGa(OHOS::AudioStandard::StreamBuffer&, bool, int const&)+656) (1e6fbb5b47c69a849f44102aac31bf1c)
#09 pc 000000000002580c /system/lib64/libaudio_capturer_gateway.z.so(OHOS::AudioStandard::AudioContainerStreamBase::Read(unsigned char&, unsigned long, bool)+132) (d6b8d1059a0b4aa23afb87da89279d56)
#10 pc 000000000003e6d4 /system/lib64/module/multimedia/libaudio.z.so (e52f380800b4f8215415d6c6e50f6787)
#11 pc 000000000001d9f8 /system/lib64/libace_napi.z.so(NativeAsyncWork::AsyncWorkCallback(uv_work_s*)+340) (4e8d9d94efd8ad145676703ee278f430)
#12 pc 0000000000012090 /system/lib64/libuv.so (c9ce135f1642201c87a21b5539612eea)
#13 pc 00000000000ebe70 /vendor/aosp/system/lib64/libc.so(__pthread_start(void*)+264) (a85ef5fb74e0282813cd1edb10854577)
#14 pc 000000000008b7f0 /vendor/aosp/system/lib64/libc.so(__start_thread+64) (a85ef5fb74e0282813cd1edb10854577)

也问了官方了,10多天了没答复


更多关于HarmonyOS鸿蒙Next中audioCapturer录音导致OOM的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

You may limit times of while loop, or capturer itself will not stop recording audio and push data into buffer, which there’s probably no way to limit the size of.

Offcial docs I notice: https://developer.harmonyos.com/en/docs/documentation/doc-guides-V3/audio-capturer-0000001493584120-V3

更多关于HarmonyOS鸿蒙Next中audioCapturer录音导致OOM的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,audioCapturer录音导致OOM(Out of Memory)问题,通常是由于录音过程中内存管理不当或资源未及时释放所致。audioCapturer是鸿蒙系统中用于音频采集的API,若在录音过程中未合理控制缓冲区大小或未及时释放已使用的资源,可能导致内存持续增长,最终触发OOM。

具体原因可能包括:

  1. 缓冲区设置过大audioCapturer的缓冲区设置过大,导致内存占用过高。
  2. 资源未释放:录音结束后未调用release()方法释放资源,导致内存泄漏。
  3. 频繁创建实例:在短时间内频繁创建audioCapturer实例,导致内存累积。

解决方法:

  1. 优化缓冲区大小:根据实际需求设置合理的缓冲区大小,避免过大。
  2. 及时释放资源:在录音结束后调用release()方法,确保资源被释放。
  3. 复用实例:避免频繁创建audioCapturer实例,尽量复用已有实例。

通过以上措施,可以有效减少内存占用,避免OOM问题的发生。

在HarmonyOS鸿蒙Next中,使用audioCapturer进行录音时,如果出现OOM(Out of Memory)问题,可能是由于以下原因:

  1. 缓冲区设置过大:audioCapturer的缓冲区设置过大,导致内存占用过高。建议根据实际需求调整缓冲区大小,避免一次性分配过多内存。

  2. 未及时释放资源:录音过程中未及时释放不再使用的资源,导致内存累积。确保在录音结束后或不再需要时,及时调用release()方法释放资源。

  3. 频繁创建实例:频繁创建audioCapturer实例可能导致内存泄漏。建议复用实例,或使用单例模式管理。

  4. 系统资源限制:设备内存资源有限,建议优化录音参数,如降低采样率或使用压缩格式,减少内存占用。

通过合理配置和资源管理,可以有效避免OOM问题。

回到顶部