将 FloatArray 音频缓冲区保存到 Android 上的 wav 文件



我在寻找使用 Kotlin 保存 Android 上 TarsosDSP 生成的音频数据的 FloatArray 缓冲区的解决方案时遇到了问题。目标是具有 1 秒的音频缓冲区,该缓冲区会不断更新新的缓冲区数据,并丢弃旧数据。我希望在请求时保存此缓冲区。

我试图使用 TarsosDSP 库找到解决方案,但它想将连续流写入 wav 文件;我需要它限制在只有一秒钟,并按需保存。这个 WavFileWriter 看起来很有前途 -> https://github.com/philburk/jsyn/blob/master/src/com/jsyn/util/WaveFileWriter.java 但是当我把它添加到我的 android 项目中时,需要 javax。直到查找javax是什么,我才知道,而且Android不支持它。试图找到一个可以解决这个问题的库,结果收效甚微。

private val SAMPLE_RATE = 16000
private val BUFFER_SIZE = 1024
private val SECONDS = 1.0
private val sampleFileName: String = "audio_sample.wav"
private var audioBuffer = FloatArray(SAMPLE_RATE * SECONDS.toInt())
private var dispatcher =
AudioDispatcherFactory.fromDefaultMicrophone(SAMPLE_RATE, BUFFER_SIZE, 128)
init {
blankProcessor = object : AudioProcessor {
override fun processingFinished() {}
override fun process(audioEvent: AudioEvent): Boolean {
var buffer = audioEvent.floatBuffer
val insertPoint = audioBuffer.lastIndex - buffer.lastIndex
Arrays.copyOfRange(audioBuffer, insertPoint, audioBuffer.size)
.copyInto(audioBuffer, 0)
buffer.copyInto(audioBuffer, insertPoint)
return true
}
}
dispatcher.addAudioProcessor(blankProcessor)
audioThread = Thread(dispatcher, "Audio Thread")
}

private fun writeWavFile() {
val file = File(context.cacheDir.absolutePath + "/" + sampleFileName)
// missing wav write code
}

TarsosDSP提供了WriterProcessor类,用于将音频写入文件:

https://github.com/JorenSix/TarsosDSP/blob/c26e5004e203ee79be1ec25c2603b1f11b69d276/src/core/be/tarsos/dsp/writer/WriterProcessor.java

这是您修改后的示例:

private var dispatcher =
AudioDispatcherFactory.fromDefaultMicrophone(SAMPLE_RATE, BUFFER_SIZE, 128)
init {
blankProcessor = object : AudioProcessor {
override fun processingFinished() {}
override fun process(audioEvent: AudioEvent): Boolean {
var buffer = audioEvent.floatBuffer
val insertPoint = audioBuffer.lastIndex - buffer.lastIndex
Arrays.copyOfRange(audioBuffer, insertPoint, audioBuffer.size)
.copyInto(audioBuffer, 0)
buffer.copyInto(audioBuffer, insertPoint)
return true
}
}
dispatcher.addAudioProcessor(blankProcessor)
// The important bit
val outputFile = File(context.filesDir, "file_name")
val randomAccessFile = RandomAccessFile(outputFile, "rw")
val fileWriter = WriterProcessor(audioFormat, randomAccessFile)
dispatcher.addAudioProcessor(fileWriter)
audioThread = Thread(dispatcher, "Audio Thread")
}

最新更新