因此,作为我正在进行的项目的一部分,我试图将多个音频片段叠加在一起以创建人群的声音,并将其写入新的 .WAV 文件。
首先,我创建一个文件(一个 16 位 PCM .WAV 文件)的 byte[] 表示,这似乎不会导致任何问题。
public byte[] toByteArray(File file)
{
try
{
AudioInputStream in = AudioSystem.getAudioInputStream(file);
byte[] byteArray = new byte[(int) file.length()];//make sure the size is correct
while (in.read(byteArray) != -1) ;//read in byte by byte until end of audio input stream reached
return byteArray;//return the new byte array
}
然后,我创建一个缓冲区(一个整数数组,以便在添加字节时防止字节溢出)并尝试在我的文件的字节数组版本中分层。
int[] buffer = new int[bufferLength];//buffer of appropriate length
int offset = 0;//no offset for the very first file
while(!convertedFiles.isEmpty())//until every sample has been added
{
byte[] curr = convertedFiles.pop();//get a sample from list
if(curr.length+offset < bufferLength)
{
for (int i =0; i < curr.length; i++)
{
buffer[i] += curr[i];
}
}
offset = randomiseOffset();//next sample placed in a random location in the buffer
}
当我尝试实现一种随机偏移时,问题就出现了。我可以将所有音频从索引 0(缓冲区 [0])添加到我的缓冲区,因此所有内容都可以立即播放,并且可以正常工作。但是,如果我尝试在整个缓冲区中随机分散单个剪辑,我会遇到问题。
当我尝试抵消文件的添加时,相对于缓冲区的长度,我得到了可怕的静态和削峰。
buffer[i+offset] += curr[i];
我意识到我需要小心避免溢出,这就是为什么我尝试使用整数缓冲区而不是字节缓冲区。
我不明白的是为什么它只在我引入偏移时才会中断。
我没有发布实际使用 AudioSystem 对象创建新文件的代码,因为它似乎没有任何效果。
这是我第一次使用音频编程,因此非常感谢任何帮助。
牧羊人nacy
相关分类