AudioRecord получает объем потока

#java #android #android-studio

#java #Android #android-studio

Вопрос:

Я хочу прочитать данные, а затем отправить их в другой поток. Прежде всего, я хочу проверить, работает ли это. Проблема в том, что getstreamVolume здесь не будет работать, и я не знаю, какой метод мне следует использовать. У меня есть этот код:

         audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC
                , SAMPLE_RATE
                , AudioFormat.CHANNEL_IN_STEREO
                , AudioFormat.ENCODING_PCM_16BIT
                , intBufferSize);

        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC
                , SAMPLE_RATE
                , AudioFormat.CHANNEL_IN_STEREO
                , AudioFormat.ENCODING_PCM_16BIT
                , intBufferSize
                , AudioTrack.MODE_STREAM);

        audioTrack.setPlaybackRate(SAMPLE_RATE);

        audioRecord.startRecording();
        audioTrack.play();

        while (true){

            audioRecord.read(AudioData, 0, AudioData.length);

            for (int i = 0; i < AudioData.length; i  ){
                AudioData[i] = (short) Math.min (AudioData[i], Short.MAX_VALUE);
            }

            audioTrack.setVolume(0.3f);
            audioTrack.write(AudioData, 0, AudioData.length);
        }
  

Как я могу проверить объем входных данных в БД? Или мне следует использовать Audio Manager?

Комментарии:

1. Извините, но почему интервал равен [-.6, 0.5]? Идея состоит в том, чтобы проверить объем входных данных и решить, нужно ли мне отправлять их на другое устройство или нет.

2. Я также думал, что -1 и 1 являются нормализованными значениями в db..

3. ОК. Итак, я возвращаюсь к вопросу: что я должен сделать, чтобы проверить громкость входного сигнала?

4. Да, Мэтт, я думаю, ты мне помог. Если у меня возникнут какие-то проблемы, я обновлю вопрос. Спасибо и извините за глупые вопросы.

Ответ №1:

Максимальная громкость аудиопотока может быть рассчитана только для нескольких выборок; это максимальное абсолютное значение, встречающееся в потоке:

 double[] samps = [0, -.5, 0, 0.5, 0, -.75, 0]

double max = 0;
for ( samp : samps ) {

    if ( abs(samp) > max) {
        max = abs(samp);
    }
}
  

Максимальная громкость для приведенного выше звукового образца будет составлять .75 (или не менее -1.25dB ); это означает, что вы можете эффективно усилить сигнал на 1,33 и не потерять никакой информации; выходной поток снова увеличится до 0dB и станет:

 [0, -.67, 0, .67, 0, -1, 0]
  

Комментарии:

1. Я знаю. Я установил 0.3 для вывода. И мне также нужно знать объем входного потока в дб.

2. Спасибо тебе, Мэтт.