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

时间:2017-09-28 03:54:47

标签: android xamarin audiorecord

无论我做什么,我都无法让Android AudioRecord课程与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始终返回-3,根据documentation是&#34; ERROR_INVALID_OPERATION&#34;。相同的代码适用于Pcm-16bit。我不知道无效操作是什么,并且我可以看到logcat中没有任何错误。

感谢。

2 个答案:

答案 0 :(得分:2)

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

<body> <div class="wrapper"> <button class="buttonlogin" onclick="document.getElementById('id01').style.display='block'" style="width:10%;">Login</button> </div> </body>

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

答案 1 :(得分:1)

  

API API和AudioTrack的AudioRecord从API LOLLIPOP开始支持ENCODING_PCM_FLOAT。

因此,在您的API-21 / API-22设备上,您将无法使用xxxxxxxxx.azurewebsites.net

API-23(Marshmallow)为PcmFloat添加了对PcmFloat的支持。