MediaRecorder.getMaxAmplitude () всегда возвращает 0,0

В настоящее время я создаю приложение для Android в студии Android, которое должно распознавать, когда уровни звука превышают определенный порог. В настоящее время я столкнулся с проблемой, что функция MediaRecorder.getMaxAmplitude () всегда возвращает 0,0. Я видел несколько человек с этой проблемой, но ни один из них не был решен.

Мой код:

MediaRecorder recorder = new MediaRecorder();

public void start() {
    MediaRecorder recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile("/dev/null");

    try {
        recorder.prepare();
        recorder.start();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void stop() {
    try {
        recorder.stop();
        recorder.release();
        recorder = null;
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public double getAmplitude() {
    try {
        return recorder.getMaxAmplitude();
    } catch (Exception e) {
        return 0;
    }
}

Примечательно, что функция stop () также не работает должным образом, но до ее вызова getAmplitude () уже не работает. Также я сам понял, что возвращается не 0 из улова, а фактическое значение.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
675
1

Ответы 1

Вы можете использовать таймер после запуска рекордера, чтобы получить максимальное значение амплитуды.

public class MainActivity extends AppCompatActivity {

    MediaRecorder mMediaRecorder;

    private int amplitudeValue = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMediaRecorder = new MediaRecorder();
        start(mMediaRecorder);

    }

    public void start(MediaRecorder recorder) {
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setOutputFile("/dev/null");

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 1000);// will update Max Amplitude Value every 1 second

        try {
            recorder.prepare();
            recorder.start();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    private class RecorderTask extends TimerTask { ;
        private MediaRecorder recorder;

        public RecorderTask(MediaRecorder recorder) {
            this.recorder = recorder;
        }

        public void run() {
            runOnUiThread(() -> amplitudeValue = recorder.getMaxAmplitude());
        }
    }
}

Спасибо за ваше время, но лямбда-выражение не подходит для среды Android. Кроме того, функция вызывается 30 раз в секунду через другую временную задачу, поэтому, если я правильно понимаю, это должно работать так же.

Tea_Lover_418 26.06.2018 10:17

Хорошо, в конце концов я получил это! Была ошибка, которая заключалась в том, что я сделал два регистратора, один в области класса и один в start (). Но это было не единственное решение. Мне также пришлось инициализировать функцию getMaxAmplitude, вызвав ее в функции запуска после рекордера.start ().

Tea_Lover_418 26.06.2018 10:57

Другие вопросы по теме