如何配置OpenSL来录制语音呼叫

时间:2017-08-09 14:08:13

标签: android audio android-ndk opensl

我正在使用MediaRecorder VOICE_CALL 音频源处理呼叫记录器应用程序,在一些marshmallow设备中它崩溃,然后我将源更改为 MIC 这里传入的语音不是记录下来。由于这个java限制现在我正在使用原生的android代码来录制语音通话。 我设法使用native-audio录音机为录音机录制音频。问题出在本机代码中,它只记录单侧语音,传入的语音没有被记录。然后我尝试了语音通信预设配置,而不是录音。以下是预设配置代码。

const SLInterfaceID id[2] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE,SL_IID_ANDROIDCONFIGURATION};
const SLboolean req[2] = { SL_BOOLEAN_TRUE,SL_BOOLEAN_TRUE};

result = (*engineEngine)->CreateAudioRecorder(engineEngine, &recorderObject, &audioSrc,
                                              &audioSnk, 2, id, req);

SLAndroidConfigurationItf inputConfig;
result = (*recorderObject)->GetInterface(recorderObject,
                                         SL_IID_ANDROIDCONFIGURATION,
                                         &inputConfig);


if (SL_RESULT_SUCCESS == result) {
    SLuint32 presetValue =SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION ;
    (*inputConfig)->SetConfiguration(inputConfig,
                                     SL_ANDROID_KEY_RECORDING_PRESET,
                                     &presetValue,
                                     sizeof(SLuint32));
    __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "\n Native PCM Conf Success\n");

} else{
    __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "\n Native PCM Conf Error %d\n",result);

}

添加预设配置后,开始录制语音电话时出现系统错误:

  

E / AudioRecord:无法获取记录源7的样本音频输入   速率16000,格式0x1,通道掩码0x10,会话925,标志0

     

E / libOpenSLES:android_audioRecorder_realize(0x559548c350)错误   创建AudioRecord对象;状态-22

     

W / libOpenSLES:离开Object :: Realize(SL_RESULT_CONTENT_UNSUPPORTED)

1 个答案:

答案 0 :(得分:0)

检查文档并设置正确的采样率,格式和掩码。通道掩码可以是立体声或单声道。我不确定你是如何获得状态-22错误的,但根据文档

,Realize错误非常清楚
  如果不支持格式,则

SL_RESULT_CONTENT_UNSUPPORTED(例如,采样率太高)

查看NDK示例以阐明您的参数设置