两个移动设备上的Android AudioRecorder读取方法问题1Redmi Note 5 Pro 2三星M10S

问题描述

应用开始使用android AudioRecord进行录制。以下是初始化的AudioRecord对象的代码,并在while循环中使用其读取方法从中读取数据。在Redmi中,设备循环计数和文件大小每次都是完美的,但是在执行sumsung设备循环计数和文件大小时此代码不同。 / p>

Log.d(TAG,“ writeAudioDataToFile:” + recordFile.length());

这大约是在三星设备logcat上录制5秒钟

   2020-08-14 13:27:47.459 31260-31805/com.example.voicerecord D/WavRecorder: writeAudioDataToFile: 71138592

这是在Redmi设备logcat上录制大约5秒钟

2020-08-14 13:28:36.384 23780-23906/com.example.voicerecord D/WavRecorder: writeAudioDataToFile: 491008

相同的代码生成不同的文件大小。

文件大小=采样率*样本大小*以秒为单位的时间*频道/ 8

在此代码
采样率= 44100 Hz
样本大小= 16位
以秒为单位的时间= 5秒
单声道的通道= 1
所以redmi设备会生成正确的文件,但Samsung设备不会。什么是 三星设备的解决方案。

 @Override
    public void prepare(String outputFile,int channelCount,int sampleRate,int bitrate) {
        this.sampleRate = sampleRate;
        this.framesPerVisInterval = (int)((VISUALIZATION_INTERVAL/1000f)/(1f/sampleRate));
        Log.d(TAG,"prepare: channelcount"+channelCount);
        this.channelCount = channelCount;
        recordFile = new File(outputFile);
        if (recordFile.exists() && recordFile.isFile()) {
            int channel = channelCount == 1 ? AudioFormat.CHANNEL_IN_MONO : 
          AudioFormat.CHANNEL_IN_STEREO;
            try {
                bufferSize = AudioRecord.getMinBufferSize(sampleRate,channel,AudioFormat.ENCODING_PCM_16BIT);
                if (bufferSize == AudioRecord.ERROR || bufferSize == AudioRecord.ERROR_BAD_VALUE) {
                    bufferSize = AudioRecord.getMinBufferSize(sampleRate,AudioFormat.ENCODING_PCM_16BIT);
                }
                Log.d(TAG,"prepare: "+bufferSize);
                recorder = new AudioRecord(
                        MediaRecorder.AudioSource.MIC,sampleRate,AudioFormat.ENCODING_PCM_16BIT,bufferSize
                );
            } catch (IllegalArgumentException e) {
        Timber.e(e,"sampleRate = " + sampleRate + " channel = " + channel + " bufferSize = " + bufferSize);

                if (recorder != null) {
                    recorder.release();
                }
            }
            if (recorder != null && recorder.getState() == AudioRecord.STATE_INITIALIZED) {
                if (recorderCallback != null) {
                    recorderCallback.onPrepareRecord();
                }
            } else {
                Timber.e("prepare() Failed");
                if (recorderCallback != null) {
                    recorderCallback.onError(new RecorderInitException());
                }
            }
        } else {
            if (recorderCallback != null) {
                recorderCallback.onError(new InvalidOutputFile());
            }
        }
    }

@Override
    public void startRecording() {
        if (recorder != null && recorder.getState() == AudioRecord.STATE_INITIALIZED) {
            if (isPaused) {
                startRecordingTimer();
                recorder.startRecording();
                if (recorderCallback != null) {
                    recorderCallback.onStartRecord(recordFile);
                }
                isPaused = false;
            } else {
                try {
                    recorder.startRecording();
                    isRecording = true;
                    recordingThread = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            writeAudioDataToFile();
                        }
                    },"AudioRecorder Thread");

                    recordingThread.start();
                    startRecordingTimer();
                    if (recorderCallback != null) {
                        recorderCallback.onStartRecord(recordFile);
                    }
                } catch (IllegalStateException e) {
                    Timber.e(e,"startRecording() Failed");
                    if (recorderCallback != null) {
                        recorderCallback.onError(new RecorderInitException());
                    }
                }
            }
        }
    }
private void writeAudioDataToFile() {
    byte[] data = new byte[bufferSize];
    FileOutputStream fos;
    try {
        if(isAppend){
            fos = new FileOutputStream(recordFile,true);
        }else{
            fos = new FileOutputStream(recordFile);
        }
    } catch (FileNotFoundException e) {
        Timber.e(e);
        fos = null;
    }
    if (null != fos) {
        int chunksCount = 0;
        ByteBuffer shortBuffer = ByteBuffer.allocate(2);
        shortBuffer.order(ByteOrder.LITTLE_ENDIAN);
        //Todo: disable loop while pause.
        while (isRecording) {
            if (!isPaused) {
                if (endProgress == totalProgress) {
                    chunksCount += recorder.read(data,bufferSize);
                    if (AudioRecord.ERROR_INVALID_OPERATION != chunksCount) {
                        long sum = 0;
                        for (int i = 0; i < bufferSize; i += 2) {
                            //Todo: find a better way to covert bytes into shorts.
                            shortBuffer.put(data[i]);
                            shortBuffer.put(data[i + 1]);
                            sum += Math.abs(shortBuffer.getShort(0));
                            shortBuffer.clear();
                        }
                        lastVal = (int) (sum / (bufferSize / 16));
                        try {
                            fos.write(data);
                        } catch (IOException e) {
                            Timber.e(e);
                            stopRecording();

                        }
                    }
                }
            }

        }

        try {
            fos.close();
        } catch (IOException e) {
            Timber.e(e);
        }
        Log.d(TAG,"writeAudioDataToFile: "+recordFile.length());

        setWaveFileHeader(recordFile,channelCount);
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)