Android: AudioRecord Class Problem: Callback is never called

前端 未结 4 620
南旧
南旧 2020-12-29 05:19

My Android Java Application needs to record audio data into the RAM and process it. This is why I use the class \"AudioRecord\" and not the \"MediaRecorder\" (records only t

4条回答
  •  情歌与酒
    2020-12-29 06:18

    Here is my code used to find average noise. Notice that it is based on listener notifications so it will save device battery. It is definitely based on examples above. Those example saved much time for me, thanks.

    private AudioRecord recorder;
    private boolean recorderStarted;
    private Thread recordingThread;
    private int bufferSize = 800;
    private short[][] buffers = new short[256][bufferSize];
    private int[] averages = new int[256];
    private int lastBuffer = 0;
    
    protected void startListenToMicrophone() {
        if (!recorderStarted) {
    
            recordingThread = new Thread() {
                @Override
                public void run() {
                    int minBufferSize = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                            AudioFormat.ENCODING_PCM_16BIT);
                    recorder = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                            AudioFormat.ENCODING_PCM_16BIT, minBufferSize * 10);
                    recorder.setPositionNotificationPeriod(bufferSize);
                    recorder.setRecordPositionUpdateListener(new OnRecordPositionUpdateListener() {
                        @Override
                        public void onPeriodicNotification(AudioRecord recorder) {
                            short[] buffer = buffers[++lastBuffer % buffers.length];
                            recorder.read(buffer, 0, bufferSize);
                            long sum = 0;
                            for (int i = 0; i < bufferSize; ++i) {
                                sum += Math.abs(buffer[i]);
                            }
                            averages[lastBuffer % buffers.length] = (int) (sum / bufferSize);
                            lastBuffer = lastBuffer % buffers.length;
                        }
    
                        @Override
                        public void onMarkerReached(AudioRecord recorder) {
                        }
                    });
                    recorder.startRecording();
                    short[] buffer = buffers[lastBuffer % buffers.length];
                    recorder.read(buffer, 0, bufferSize);
                    while (true) {
                        if (isInterrupted()) {
                            recorder.stop();
                            recorder.release();
                            break;
                        }
                    }
                }
            };
            recordingThread.start();
    
            recorderStarted = true;
        }
    }
    
    private void stopListenToMicrophone() {
        if (recorderStarted) {
            if (recordingThread != null && recordingThread.isAlive() && !recordingThread.isInterrupted()) {
                recordingThread.interrupt();
            }
            recorderStarted = false;
        }
    }
    

提交回复
热议问题