gpt4 book ai didi

java - 使用 Okio 创建 WAV 文件

转载 作者:行者123 更新时间:2023-12-01 09:33:04 30 4
gpt4 key购买 nike

我的系统需要使用 WAV 文件数组的字节创建单个 WAV 文件。目前它使用 Okio 在缓冲区上读取和写入数据,然后将数据写入最终文件。

我正在关注此文档和此堆栈溢出问题:

还有...

  • 奥基奥:1.10.0
  • Kotlin :1.0.2-1
  • Java:1.7

我创建了这段代码:

fun mixAudios() {

try {

//Create the file used to storage the mixed audio file.
val file = File(directory, finalFileName)

//Open the buffer for this file.
val bufferedSink = Okio.buffer(Okio.appendingSink(file))

//Data header of the file.
val header = Buffer()

//Data of the file.
val data = Buffer()

//Do a action for every audio.
audios.forEach {

//Try to read the file, if success, return the file.
Okio.buffer(Okio.source(File(it.address)))?.let { file ->

//Create a new buffer for every audio address.
val buffer = Buffer()

//Read every byte on the buffer.
file.readAll(buffer)

//Remove the first 44 items of the buffer.
buffer.readByteArray(44)

//Get the buffer and write every byte on the sink.
data.writeAll(buffer)

//Close the sink.
buffer.close()
file.close()
}
}

//Count of bytes on the data buffer.
val fileSize = data.size().toInt()

//The data is ready to be written on the sink.
data.close()

val totalFileSize = fileSize + 36
val byteRate = (SAMPLE_RATE * CHANNELS * BYTES_PER_SAMPLE) / 8

//Write the header of the final file.
header.writeUtf8("RIFF")

//Write the total file size (with the header)
.writeByte(totalFileSize and 0xff)
.writeByte((totalFileSize shr 8) and 0xff)
.writeByte((totalFileSize shr 16) and 0xff)
.writeByte((totalFileSize shr 24) and 0xff)
// .writeIntLe(fileSize) //Inform the size of the chunk, including the header.

.writeUtf8("WAVE") //Inform the type of file.
.writeUtf8("fmt ") //Add the "fmt" letters
.writeIntLe(samplingRate) //fmt chunk

.writeByte(AUDIO_FORMAT_PCM) //This byte represents the audio format (PCM).
.writeByte(0)

.writeByte(CHANNELS) //This byte represents the channels of the audio.
.writeByte(0)

//Write the sample rate
.writeByte(SAMPLE_RATE and 0xff)
.writeByte((SAMPLE_RATE shr 8) and 0xff)
.writeByte((SAMPLE_RATE shr 16) and 0xff)
.writeByte((SAMPLE_RATE shr 24) and 0xff)
// .writeIntLe(SAMPLE_RATE) //The sample rate of the audio

//Write the byte rate
.writeByte(byteRate and 0xff)
.writeByte((byteRate shr 8) and 0xff)
.writeByte((byteRate shr 16) and 0xff)
.writeByte((byteRate shr 24) and 0xff)
// .writeIntLe((SAMPLE_RATE * CHANNELS * BYTES_PER_SAMPLE) / 8) //Byte rate

.writeByte(CHANNELS * BYTES_PER_SAMPLE / 8) //Block align
.writeByte(0)

.writeByte(BYTES_PER_SAMPLE) //Bytes per sample
.writeByte(0)

.writeUtf8("data") //File content size

.writeByte(fileSize and 0xff)
.writeByte((fileSize shr 8) and 0xff)
.writeByte((fileSize shr 16) and 0xff)
.writeByte((fileSize shr 24) and 0xff)
// .writeIntLe(fileSize)

.close()

with (bufferedSink) {
writeAll(header)
writeAll(data)
close() //Close and write the file on the memory.
}

//Do the rest...

} catch (e: Exception) {
if (debugEnabled) {
e.printStackTrace()
}
}
}

文件已成功生成,但是当我尝试在任何媒体播放器上打开此音频时,它似乎已损坏。

当我尝试探索生成的音频文件的字节时,结果如下所示:

bytes

我不知道我写的标题是否正确,你能帮我解决这个问题吗?

谢谢!

最佳答案

您从哪里获取采样率的值?您正在编写 80 3E 00 00(即 16000),但实际上应该是 10 00 00 00(即原始 PCM 格式的 16)。

此时,您应该在 header 中写入 fmt block 的大小。

希望这能解决您的问题

关于java - 使用 Okio 创建 WAV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39238559/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com