编码为 PCM-Float 时无法从 AudioRecord 读取

Can't read from AudioRecord when encoding is PCM-Float

无论我做什么,我都无法让 Android AudioRecord class 与 Pcm-Float 一起工作。

这是我的代码:

public AndroidAudioDriver(Sensor sensor, int desiredSampleRate)
{
    _sensor = sensor;

    if (!InitialiseSampleRate(desiredSampleRate))
    {
        throw new NotSupportedException("No supported audio sample rates found");
    }
    recorder = new AudioRecord(AudioSource.Mic, SampleRate, ChannelIn.Mono, Encoding.PcmFloat, _bufferSize);
    _recorder.StartRecording();
    var res = _recorder.Read(_audioData, 0, (int)(SampleRate * _readPortion));
}

private bool InitialiseSampleRate(int rate)
{
    for (int i = rate; i < 48000; i += 100)
    {  // add the rates you wish to check against
        _bufferSize = AudioRecord.GetMinBufferSize(i, ChannelIn.Mono, Encoding.Pcm16bit) * 10;
        if (_bufferSize > 0)
        {
            _audioData = new byte[_bufferSize];
            SampleRate = i;
            return true;
        }
    }
    return false;
}

_recorder.read总是returns-3,根据documentation是"ERROR_INVALID_OPERATION"。相同的代码适用于 Pcm-16 位。我不知道无效操作是什么,logcat 中没有任何错误,我可以看到。

谢谢。

AudioRecord as of API M and AudioTrack as of API LOLLIPOP support ENCODING_PCM_FLOAT.

因此在您的 API-21 / API-22 设备上您将没有 PcmFloat 可用

API-23 (Marshmallow) 为 AudioRecord.

添加了对 PcmFloat 的支持

要将 PcmFloat 与 AudioRecord 一起使用,您必须使用重载:

AudioRecord.Read(float[], offset, count, readType).

问题是我向它传递了一个字节[],它似乎只适用于 Pcm8bit 和 Pcm16bit。