有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    从中读取数据会遇到奇怪的障碍:这是因为从字节中读取的数据是从一个奇怪的位置开始的。使用以下方法从偶数位置开始:

    for (i=0; i<(b2.length/frameSize); i++) {
          int ind=(int)((i*frameSize*playBackSpeed));
          if((ind%2)==1) ind++;
        for (j=0; j<frameSize; j++) {
            b2[(i*frameSize)+j] = b1[ind+j];
        }
    }
    

    或者您可以将跳转更改为4:

        if((ind%4)>0) ind+=(4-(ind%4));