Я создаю приложение для Android, которое импульсирует значок - простой импульс, 2x размер при громкой громкости и 1 раз без звука - на основе звука. Стоит отметить, что мой min api равен 15.Android пульсирует значок при изменении объема .wav
Пользователь выбирает режим (файл) для воспроизведения, и я использую AudioTrack для воспроизведения его в бесконечном цикле. Каждый выбор wav варьируется от < секунд до 2 или 3 секунд. Audiotrack позволяет мне устанавливать громкость и высоту тона в реальном времени на основе пользовательского ввода (SoundPool неправильно менял шаг в Kitkat). Поскольку громкость изменяется в пределах каждого аудиотрека, я пытаюсь сжать и развить значок. До сих пор я пробовал визуализатор, чтобы получить данные осциллограммы и fft по мере воспроизведения трека, но я не уверен, что это правильно.
Есть ли способ получить (ближайшее возможное) изменение в реальном времени db из аудиотрека? Кажется, что функция формы волны всегда находится между 108 и 112, поэтому я не думаю, что правильно ее использую. Самый простой пример pulse.wav является here
Мой AudioTrack инициализации с использованием байт [] из данных ИКМ-
AudioTrack mAudioTrack = new AudioTrack(AudioAudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, getMinBuffer(sound), AudioTrack.MODE_STATIC);
mAudioTrack.write(mSound, 0, mSound.length);
mAudioTrack.setLoopPoints(0, (int)(mSound.length/4), -1);
My Visualizer
Visualizer mVisualizer = new Visualizer(mAudioTrack.getAudioSessionId());
mVisualizer.setEnabled(false);
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener {
@Override
public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
double sum = 0;
for (int i = 0; i < bytes.length; i++) {
sum += Math.abs(bytes[i]) * Math.abs(bytes[i]);
}
double volume = (double) Math.sqrt(1.0d * sum/bytes.length);
//THIS IS THE RESIZE FUNCTION//
//resizeHeart((double) volume);
System.out.println("Volume: " + volume); //always prints out between 108 and 112.
}
@Override
public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
//not sure what to do here.
}
}, Visualizer.getMaxCaptureRate()/2, true, true);
mVisualizer.setEnabled(true);
Это приводит к предупреждению оператора '||' не может применяться к 'int', 'byte'. Какие-либо предложения? –