5

我试图获取Android上的SLDeviceVolumeItf界面,但出现错误:RecorderObjectSL_RESULT_FEATURE_UNSUPPORTED.

我读到 OpenSL ES 的 Android 实现不支持AudioRecorder. 真的吗?

如果是,有解决方法吗?我有一个 VOIP 应用程序,它在 Galaxy Nexus 上运行不佳,因为麦克风增益非常高。

我还尝试将SL_IID_ANDROIDCONFIGURATION设置streamType为新的VOICE_COMMUNINCATION音频源,但我再次收到错误 12(不支持)。

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

result = (*engine)->CreateAudioRecorder(engine, &recorderObject, &audioSrc,  &audioSnk, 2, id, req);
if (SL_RESULT_SUCCESS != result) {
    return false;
}

SLAndroidConfigurationItf recorderConfig;   
result = (*recorderObject)->GetInterface(recorderObject, SL_IID_ANDROIDCONFIGURATION, &recorderConfig);
if(result != SL_RESULT_SUCCESS) {
    error("failed to get SL_IID_ANDROIDCONFIGURATION interface. e == %d", result);
}

recorderObject 已创建,但我无法获取SL_IID_ANDROIDCONFIGURATION接口。我在 Galaxy Nexus (ICS)、HTC sense (ICS) 和 Motorola Blur (Gingerbread) 上进行了尝试。我正在使用 NDK 版本 6。

4

4 回答 4

1

现在我可以得到接口了。我不得不使用 NDK 8 和 target-14。当我尝试使用 10 作为目标时,编译本机代码时出错(未找到 dirent.h)。我不得不使用 target-platform-14。

于 2012-06-21T11:51:33.070 回答
0

我遇到了类似的问题。我的结果是返回未实现的错误代码。但是,我的问题是我没有使用SL_IID_ANDROIDCONFIGURATION接口标志创建记录器。

于 2013-11-07T04:03:20.407 回答
0
    apiLvl = (*env)->GetStaticIntField(env, versionClass, sdkIntFieldID);

SLint32 streamType = SL_ANDROID_RECORDING_PRESET_GENERIC;
    if(apiLvl > 10){
        streamType = SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION;
        I("set SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION");
    }

    result = (*recorderConfig)->SetConfiguration(recorderConfig, SL_ANDROID_KEY_RECORDING_PRESET, &streamType, sizeof(SLint32));
    if (SL_RESULT_SUCCESS != result) {
        return 0;
    }
于 2013-12-06T03:12:04.613 回答
0

即使我试图找到一种方法来改变 OpenSL 中的增益,看起来好像没有 api/接口。我通过实现一个简单的移位增益乘法器来解决问题

void multiply_gain(void *buffer, int bytes, int gain_val) { int i = 0, j = 0;

    short *buffer_samples = (short*)buffer;

    for(i = 0, j = 0; i < bytes; i+=2,j++)
    {
       buffer_samples[j] = (buffer_samples[j] >> gain_val);
    }

}

但是这里的增益是乘/除(基于 << 或 >>)乘以因子或 2。如果您需要更平滑的增益曲线,则需要编写更复杂的数字增益函数。

于 2014-06-17T08:12:07.407 回答