java我无法改变音乐文件的速度而不避免出现令人不安的噪音
我试图改变音频文件的速度,如果我使用无符号值,一切都可以,但一旦我开始使用双值,事情就会变得一团糟,例如,我的代码适用于所有的“x.5”数字,但不适用于任何其他带小数的数字,在我的情况下,我想将速度提高1.3个点。但我得到的只是一个文件,你几乎什么都听不到,只有烦人的噪音
以下是我正在使用的代码:
import javax.swing.JOptionPane;
import javax.sound.sampled.*;
import java.net.URL;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.ByteArrayInputStream;
import java.util.Date;
class AcceleratePlayback {
public static void main(String[] args) throws Exception {
//double playBackSpeed = 1.5; Works
//double playBackSpeed = 1.3; Doesn't work
File file1= new File("Sample2.wav");
File file2= new File("DEF.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(file1);
AudioFormat af = ais.getFormat();
int frameSize = af.getFrameSize();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[2^16];
int read = 1;
while( read>-1 ) {
read = ais.read(b);
if (read>0) {
baos.write(b, 0, read);
}
}
byte[] b1 = baos.toByteArray();
byte[] b2 = new byte[(int)(b1.length/playBackSpeed)];
for (int i=0; i<(b2.length/frameSize); i++) {
for (int j=0; j<frameSize; j++) {
b2[(i*frameSize)+j] = b1[(int)((i*frameSize*playBackSpeed)+j)];
}
}
ByteArrayInputStream bais = new ByteArrayInputStream(b2);
AudioInputStream aisAccelerated =
new AudioInputStream(bais, af, b2.length/frameSize);
AudioSystem.write(aisAccelerated, AudioFileFormat.Type.WAVE, file2);
}
}
# 1 楼答案
从中读取数据会遇到奇怪的障碍:这是因为从字节中读取的数据是从一个奇怪的位置开始的。使用以下方法从偶数位置开始:
或者您可以将跳转更改为4: