2014-11-04 4 views
0

В моем приложении я разрешаю пользователю записывать звук с помощью камеры телефона во время записи. Я обновляю путь с использованием времени в качестве значения X и нормализованной формы getMaxAmplitude() для значения y ,getMaxAmplitude() альтернатива для визуализатора

float amp = Math.min(mRecorder.getMaxAmplitude(), mMaxAmplitude) 
       /(float) mMaxAmplitude; 

Это работает довольно хорошо.

Моя проблема возникает, когда я иду воспроизводить аудио (после транспортировки по сети). Я хочу воссоздать форму волны, генерируемую во время записи, но класс MediaPlayer не обладает тем же методом getMaxAmplitude().

Я пытаюсь использовать класс Visualizer, предоставляемый инфраструктурой, но мне трудно получить полезный результат для значения y. Возвращаемый массив байтов содержит значения от -128 до 127, но когда я смотрю на фактические значения, они не отображаются как форма волны, как я ожидал бы.

Как использовать значения, возвращаемые визуализатором, для получения значения, связанного с громкостью звука?

ответ

0

Ваш массив байтов, вероятно, представляет собой массив из 16, 24 или 32 бит знаковых значений. Предполагая, что они имеют 16-битную подпись, байты будут чередованием hi-байта, причем MSB является битом знака и lo-байтом. Или, в зависимости от континентности, это может быть lo-byte, за которым следует старший байт. Более того, если у вас есть два канала данных, каждый образец, вероятно, чередуется. Опять же, при условии, 16-бит, вы можете декодировать образцы что-то в манере, подобной этой:

for (int i = 0 ; i < numBytes/2 ; ++i) 
{ 
    sample[i] = (bytes[i*2] << 8) | bytes[i*2+1]; 
} 

Согласно документации getMaxAmplitude, она возвращает максимальную абсолютную амплитуду, которая сэмпл с момента последнего вызова. Я предполагаю, что это означает максимальную амплитуду, но это не совсем ясно из документации. Чтобы вычислить амплитуду пика, просто вычислите максимум абс всех образцов.

int maxPeak = 0.0; 
for (int i = 0 ; i < numSamples ; ++i) 
{ 
    maxPeak = max(maxPeak, abs(samples[i])); 
} 
Смежные вопросы