Воспроизведение звука и отображение текущего времени с помощью 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
}
Это работает в том смысле, что возвращает числа. Но цифры не верны. Для аудиофайла (использующего кодировку 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