【问题标题】:How to configure OpenSL to record voice call如何配置 OpenSL 来录制语音通话
【发布时间】:2018-01-17 11:37:19
【问题描述】:

我正在使用 MediaRecorder VOICE_CALL 音频源开发通话记录器应用程序,在某些棉花糖设备中它崩溃了,然后我将源更改为 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)

【问题讨论】:

  • 你在谈论github.com/googlesamples/android-ndk/tree/master/audio-echo这个链接,但在我的情况下,音频文件不是用这个代码创建的
  • 不,我使用了这个例子:github.com/googlesamples/android-ndk/tree/master/native-audio,在语音通话期间,我启动了录音机,并将缓冲区存储的文件作为 .pcm 存储在 sd 卡中。检查此链接以保存到 SD 卡:stackoverflow.com/questions/18444354/…
  • 表示它没有自动启动?我运行代码有一个按钮启动所以当我打电话给任何人时我去这个appp并按下按钮开始然后它会开始记录?它把我的文件放在哪个文件夹?
  • 您需要将缓冲区保存在 sdcard 中,在您的情况下,它会将记录的文件作为缓冲区数据保存在 ram 中。您需要将该本地文件放入您的通话记录器应用程序中,并在触发通话时启动记录器。
  • 你解决了吗?

标签: android audio android-ndk opensl


【解决方案1】:

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

SL_RESULT_CONTENT_UNSUPPORTED 如果格式不受支持(例如采样率太高)

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

【讨论】:

    猜你喜欢
    • 2017-05-27
    • 2011-08-23
    • 2013-10-02
    • 2013-03-24
    • 2011-05-10
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多