HarmonyOS鸿蒙Next中opensl es接口进行音频录制失败

HarmonyOS鸿蒙Next中opensl es接口进行音频录制失败

SLresult result; result = slCreateEngine(&engineObject, 0, nullptr, 0, nullptr, nullptr); assert(SL_RESULT_SUCCESS == result); result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE); assert(SL_RESULT_SUCCESS == result);

SLEngineItf engineItf = nullptr;
result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineItf);
assert(SL_RESULT_SUCCESS == result);

SLDataLocator_IODevice io_device = {SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, SL_DEFAULTDEVICEID_AUDIOINPUT,
                                    nullptr};
SLDataSource audioSource = {&io_device, NULL};
SLDataLocator_BufferQueue buffer_queue = {SL_DATALOCATOR_BUFFERQUEUE, 3};
// 具体参数需要根据音频文件格式进行适配
SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM,           // 输入的音频格式
                               1,                           // 单声道
                               SL_SAMPLINGRATE_44_1,        // 采样率: 8000HZ
                               SL_PCMSAMPLEFORMAT_FIXED_16, // 音频采样格式,小尾数,带符号的16位整数
                               0,
                               0,
                               0};
SLDataSink audioSink = {&buffer_queue, &format_pcm};

const SLInterfaceID id[1] = {SL_IID_OH_BUFFERQUEUE};
const SLboolean req[1] = {SL_BOOLEAN_TRUE};
result = (*engineItf)->CreateAudioRecorder(engineItf, &pcmCapturerObject, &audioSource, &audioSink, 1, id, req);
assert(SL_RESULT_SUCCESS == result);
result = (*pcmCapturerObject)->Realize(pcmCapturerObject, SL_BOOLEAN_FALSE);
assert(SL_RESULT_SUCCESS == result);

result = (*pcmCapturerObject)->GetInterface(pcmCapturerObject, SL_IID_RECORD, &recordItf);
assert(SL_RESULT_SUCCESS == result);

SLOHBufferQueueItf bufferQueueItf;
result = (*pcmCapturerObject)->GetInterface(pcmCapturerObject, SL_IID_OH_BUFFERQUEUE, &bufferQueueItf);
//assert(SL_RESULT_SUCCESS == result);
result = (*bufferQueueItf)->RegisterCallback(bufferQueueItf, RecordBufferQueueCallback, self);
assert(SL_RESULT_SUCCESS == result);

SLuint32 state;
(*recordItf)->GetRecordState(recordItf, &state);
TSK_DEBUG_INFO("GetRecordState %d",state);    
result = (*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_RECORDING);
assert(SL_RESULT_SUCCESS == result);

更多关于HarmonyOS鸿蒙Next中opensl es接口进行音频录制失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

您好,可以通过在线提单进一步解决:https://developer.huawei.com/consumer/cn/support/feedback/#/

更多关于HarmonyOS鸿蒙Next中opensl es接口进行音频录制失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我也是无法收到回调,怎么解决的?

在HarmonyOS鸿蒙Next中,使用OpenSL ES接口进行音频录制失败可能涉及多个方面。首先,确保设备支持OpenSL ES接口,并且系统版本兼容。其次,检查权限设置,确保应用已获取录音权限。此外,确认音频参数配置正确,如采样率、声道数等。如果问题依旧,可能是OpenSL ES实现或驱动层存在兼容性问题,需进一步排查。

在HarmonyOS鸿蒙Next中使用OpenSL ES接口进行音频录制失败,可能原因包括:

  1. 权限未正确配置,确保已申请RECORD_AUDIO权限;

  2. OpenSL ES引擎或录音器未正确初始化,检查SLObjectItfSLRecordItf的创建与配置;

  3. 音频参数设置不当,如采样率、声道数等需与设备兼容;

  4. 设备资源冲突,确保无其他应用占用音频资源。

建议逐步排查并参考官方文档调试。

回到顶部