Как настроить OpenSL для записи голосового вызова

Я работаю над приложением для записи звонков с использованием источника звука 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)


person Bharath Kumar    schedule 09.08.2017    source источник
comment
Вы говорите о github.com/googlesamples/android-ndk/tree/ master / audio-echo эта ссылка, но в моем случае аудиофайл не создается с помощью этого кода   -  person Bhanu Sharma    schedule 01.09.2017
comment
Нет, я использовал этот пример: github.com/googlesamples/android-ndk/ tree / master / native-audio, и во время голосового вызова я запустил диктофон и в буфере сохранил файл как .pcm внутри SD-карты. Проверьте эту ссылку для сохранения на SD-карту: stackoverflow.com/questions/18444354/   -  person Bharath Kumar    schedule 01.09.2017
comment
означает, что он не запускается автоматически? Я запускаю код, есть одна кнопка запуска, поэтому, когда я вызываю tmo любого, я перехожу к этому приложению и нажимаю кнопку запуска, тогда он начнет запись? В какую папку помещается мой файл?   -  person Bhanu Sharma    schedule 01.09.2017
comment
Вам необходимо сохранить буфер на SD-карте, в вашем случае он сохранит записанный файл в оперативной памяти как данные буфера. Вам нужно поместить этот собственный файл в приложение для записи звонков и запустить рекордер при срабатывании вызова.   -  person Bharath Kumar    schedule 01.09.2017
comment
Удалось ли вам это решить?   -  person Paras Watts    schedule 12.09.2017
comment
Привет, @BharathKumar, я думаю, что мы оба на одной странице, я просто хотел подтвердить, смогли ли вы исправить эту проблему или нет?   -  person japanjot singh    schedule 04.10.2017
comment
@japanjotsingh Нет решения для этого.   -  person Bharath Kumar    schedule 06.10.2017
comment
Примите участие в моем проекте github.com/ViktorDegtyarev/CallRecLib Давайте вместе найдем решение!   -  person Viktor Degtyarev    schedule 19.10.2017


Ответы (1)


проверьте документацию и установите правильную частоту дискретизации, формат и маску. Маска канала может быть стерео или моно. Я не уверен, как вы получаете сообщение об ошибке status -22, но, как указано в документации, вы понимаете, что ошибка очень ясна.

SL_RESULT_CONTENT_UNSUPPORTED, если формат не поддерживается (например, слишком высокая частота дискретизации)

Посмотрите на образец NDK, чтобы уточнить настройку параметров.

person Ketan    schedule 10.08.2017