Получите среднюю амплитуду аудиофайла во время его воспроизведения.Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Получите среднюю амплитуду аудиофайла во время его воспроизведения.

Сообщение Anonymous »

Я пытаюсь создать приложение для Android, которое воспроизводит звук и показывает текущее время + среднюю амплитуду в виде ползунков.
Воспроизведение звука и отображение текущего времени с помощью MediaPlayer было довольно простым.
Но я не могу получить правильную среднюю амплитуду воспроизводимого звука.
Это функциональная часть моего кода —

Код: Выделить всё

  val mediaPlayerMap: MutableMap = mutableMapOf()
val visualizerMap: MutableMap = mutableMapOf()

private fun createDataCaptureListener(visualizer: Visualizer): Visualizer.OnDataCaptureListener {
return object : Visualizer.OnDataCaptureListener {

override fun onWaveFormDataCapture(
visualizer: Visualizer,
waveFormData: ByteArray,
samplingRateMilliHerz: Int
) {
// Wrap the ByteArray in a ByteBuffer
val buffer = ByteBuffer.wrap(waveFormData)
var maxAmplitude = 0.0f
var sum = 0.0f
var count = 0
while (buffer.hasRemaining()) {
val amplitude = buffer.getShort()
sum += kotlin.math.abs(amplitude.toInt())
count++
if (amplitude > maxAmplitude) {
maxAmplitude = amplitude.toFloat()
}
}
var averageAmplitude = 0.0f
if (count > 0) {
averageAmplitude = sum / count
}

// Normalize amplitudes
val normalizedMaxAmplitude = maxAmplitude / 32768.0f
val normalizedAverageAmplitude = averageAmplitude / 32768.0f
Log.e(
"Visualizer",
"maxAmplitude: $normalizedMaxAmplitude, averageAmplitude: $normalizedAverageAmplitude")
}

override fun onFftDataCapture(
visualizer: Visualizer,
fftData: ByteArray,
samplingRateMilliHerz: Int
) {
// Do nothing for now
}
}
}

fun updateAudioSettings(fileUrl: String, play: Boolean): Float {
var mediaPlayer = mediaPlayerMap[fileUrl]
if (mediaPlayer == null) {
mediaPlayer =
MediaPlayer().apply {
setDataSource(fileUrl)
prepare()
}

mediaPlayerMap[fileUrl] = mediaPlayer
}

var visualizer = visualizerMap[fileUrl]

if (play) {
if (!mediaPlayer.isPlaying) {
mediaPlayer.start()
}

if (visualizer == null || visualizer?.enabled == false) {
visualizer?.release()
val visualizer = Visualizer(mediaPlayer.audioSessionId)
val rate = Visualizer.getMaxCaptureRate()
visualizer.setDataCaptureListener(
createDataCaptureListener(visualizer),
rate,
true, // wave form requested
true, // fft requested
)
visualizer.enabled = true
visualizerMap[fileUrl] = visualizer
}
} else {
if (mediaPlayer.isPlaying) {
mediaPlayer.pause()
}
visualizer?.release()
visualizerMap.remove(fileUrl)
}

return mediaPlayer.currentPosition / 1000.0f
}
Я также пробовал использовать RMS.
Это работает в том смысле, что возвращает числа. Но цифры не верны. Для аудиофайла (использующего кодировку PCM 16) он возвращает значения в диапазоне 0,5–0,75. Но когда я проверяю тот же файл в https://www.maztr.com/audiofileanalyzer, я получаю среднюю амплитуду 0,000007 и максимальную амплитуду: 0,019836.
Я готов использовать ExoPlayer, если он справляется с этим лучше.
В идеале я хотел бы иметь способ расчета средней амплитуды, не беспокоясь о типе кодирования аудиофайла. Я ищу эквивалент https://developer.apple.com/documentati ... eragepower в Android.
Возможно ли это?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ing-played
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»