AudioRecord.State is always State.Uninitialized

今天在自己的锤子手机上遇到个奇葩问题,AudioRecord初始化失败,其他手机都正常的。
一通google下来,找到了个折中办法,就是把所有AudioSource音频来源,采样率,采样精度这些都遍历一遍。方法见以下代码。

//音频采集来源
private static final int mAudioSource = MediaRecorder.AudioSource.MIC; //麦克风
//音频采样率 (MediaRecoder的采样率通常是8000Hz AAC的通常是44100Hz.设置采样率为44100目前为常用的采样率,官方文档表示这个值可以兼容所有的设置)
private static final int mSampleRateInHz = 16000/*44100*/;
//声道
private static final int mChannelConfig = AudioFormat.CHANNEL_IN_MONO; //单声道
//数据格式  (指定采样的数据的格式和每次采样的大小)
//指定音频量化位数 ,在AudioFormaat类中指定了以下各种可能的常量。通常我们选择ENCODING_PCM_16BIT和ENCODING_PCM_8BIT PCM代表的是脉冲编码调制,它实际上是原始音频样本。
//因此可以设置每个样本的分辨率为16位或者8位,16位将占用更多的空间和处理能力,表示的音频也更加接近真实。
private static final int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
//指定最小录音缓冲区大小
private int mBufferSizeInBytes;
//计算最小录音缓冲区大小
mBufferSizeInBytes = AudioRecord.getMinBufferSize(mSampleRateInHz, mChannelConfig, mAudioFormat);
AudioRecord mAudioRecord = new AudioRecord(mAudioSource, mSampleRateInHz, mChannelConfig, mAudioFormat, mBufferSizeInBytes);

private static int[] mSampleRates = new int[]{8000, 16000,11025, 22050, 44100};
private static int[] mAudioSourceArr = new int[]{MediaRecorder.AudioSource.DEFAULT,
        MediaRecorder.AudioSource.MIC};
private static int[] mAudioFormataArr = new int[]{
        AudioFormat.ENCODING_INVALID,
        AudioFormat.ENCODING_DEFAULT,
        AudioFormat.ENCODING_PCM_16BIT,
        AudioFormat.ENCODING_PCM_8BIT,
        AudioFormat.ENCODING_PCM_FLOAT,
        AudioFormat.ENCODING_AC3,
        AudioFormat.ENCODING_E_AC3,
        AudioFormat.ENCODING_DTS,
        AudioFormat.ENCODING_DTS_HD,
        AudioFormat.ENCODING_MP3,
        AudioFormat.ENCODING_AAC_LC,
        AudioFormat.ENCODING_AAC_HE_V1,
        AudioFormat.ENCODING_AAC_HE_V2,
        AudioFormat.ENCODING_IEC61937,
        AudioFormat.ENCODING_DOLBY_TRUEHD,
        AudioFormat.ENCODING_AAC_XHE,
        AudioFormat.ENCODING_AC4,
        AudioFormat.ENCODING_E_AC3_JOC};
private static int[] mChannelConfigArr = new int[]{
        AudioFormat.CHANNEL_IN_DEFAULT,
        AudioFormat.CHANNEL_IN_RIGHT,
        AudioFormat.CHANNEL_IN_FRONT,
        AudioFormat.CHANNEL_IN_BACK,
        AudioFormat.CHANNEL_IN_LEFT_PROCESSED,
        AudioFormat.CHANNEL_IN_RIGHT_PROCESSED,
        AudioFormat.CHANNEL_IN_FRONT_PROCESSED,
        AudioFormat.CHANNEL_IN_BACK_PROCESSED,
        AudioFormat.CHANNEL_IN_PRESSURE,
        AudioFormat.CHANNEL_IN_X_AXIS,
        AudioFormat.CHANNEL_IN_Y_AXIS,
        AudioFormat.CHANNEL_IN_Z_AXIS,
        AudioFormat.CHANNEL_IN_VOICE_UPLINK,
        AudioFormat.CHANNEL_IN_VOICE_DNLINK,
        AudioFormat.CHANNEL_IN_MONO,
        AudioFormat.CHANNEL_IN_STEREO,
};

public AudioRecord findAudioRecord() {

    for (int rate : mSampleRates) {
        // AudioFormat.ENCODING_PCM_16BIT;
        for (int audioFormat : mAudioFormataArr) {
            for (int channelConfig : mChannelConfigArr) {
                for (int mAudioSource : mAudioSourceArr) {
                    try {
                        int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);

                        if (bufferSize > 0) {
                            // check if we can instantiate and have a success
                            AudioRecord recorder = new AudioRecord(mAudioSource, rate, channelConfig, audioFormat, bufferSize);

                            int state = recorder.getState();
                            LogUtil.i("state:" + state);
                            if (state == AudioRecord.STATE_INITIALIZED) {
                                LogUtil.i("audioformat:" + audioFormat + ";channelConfig:" + channelConfig + ";mAudioSource:" + mAudioSource);
                                //audioformat:2;channelConfig:1;mAudioSource:0
                                //ENCODING_PCM_16BIT
                                //CHANNEL_IN_DEFAULT
                                //DEFAULT
                                return recorder; //It never gets here ?????
                            } else {
                                recorder.release();
                            }
                        }

                    } catch (Exception e) {
                        LogUtil.i("e:" + e.getLocalizedMessage());
                    }
                }


            }

        }

    }

    return null;
}

 

上一篇:windows2019下Docker部署Always on集群 测试


下一篇:BUAA计组p1_Verilog的复习tips