Skip to end of metadata
Go to start of metadata

Чтобы проверить микрофон перед публикацией, необходимо получить значение уровня сигнала. Для этого используется класс android.media.MediaRecorder. При этом необходимо записывать аудио в файл. В версиях Android 10 и ниже, можно было записывать в псевдоустройство /dev/null. однако с Android 11 это невозможно, и требуется открывать на запись реальный файл, располагая его в данных приложения:

code

            mRecorder = new MediaRecorder();
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            String fileName = context.getFilesDir().getAbsolutePath() + "/test.3gp";
            //Path /dev/null throw exception on Android 11
            mRecorder.setOutputFile(fileName);

            try {
                mRecorder.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            mRecorder.start();

От объекта MediaRecorder можно получить мгновенное значение амплитуды сигнала

code

    public double getAmplitude() {
        if (mRecorder != null)
            return (mRecorder.getMaxAmplitude() / 2700.0);
        else
            return 0;

    }

и затем усреднить его для отображения

code

    static final private double EMA_FILTER = 0.6;
    private double mEMA = 0.0;
    ...
    public double getAmplitudeEMA() {
        double amp = getAmplitude();
        mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
        return mEMA;
    }
  • No labels