Java とサウンド API を使用してサウンド ファイルの再生速度を上げる方法についての情報を探しています。
私は現在、クリップと AudioInputStream を使用してファイルを再生していますが、再生速度を上げることができるのであれば、喜んで変更します。
これは、線形補間を使用して行います。サンプルを少しずつ進めながら、分数距離を使用してストリーミングする値を作成します。
たとえば、1.25 (値 10 のサンプルと値 30 のサンプルの間) に到達した場合、値 15 を出力します。
元の速度の整数倍 (2,3,4..) で再生する粗雑な方法は、元の入力ストリームのサンプルをすべてスキップすることです。EG 2 倍速の場合は 2 分の 1 をスキップし、3 倍速の場合は 3 分の 2 をスキップします。
import javax.swing.JOptionPane;
import javax.sound.sampled.*;
import java.net.URL;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.util.Date;
class AcceleratePlayback {
public static void main(String[] args) throws Exception {
int playBackSpeed = 1;
if (args.length>0) {
try {
playBackSpeed = Integer.parseInt(args[0]);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
int skip = playBackSpeed-1;
System.out.println("Playback Rate: " + playBackSpeed);
URL url = new URL("http://pscode.org/media/leftright.wav");
System.out.println("URL: " + url);
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
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);
}
}
System.out.println("End entire: \t" + new Date());
byte[] b1 = baos.toByteArray();
byte[] b2 = new byte[b1.length/playBackSpeed];
for (int ii=0; ii<b2.length/frameSize; ii++) {
for (int jj=0; jj<frameSize; jj++) {
b2[(ii*frameSize)+jj] = b1[(ii*frameSize*playBackSpeed)+jj];
}
}
System.out.println("End sub-sample: \t" + new Date());
ByteArrayInputStream bais = new ByteArrayInputStream(b2);
AudioInputStream aisAccelerated =
new AudioInputStream(bais, af, b2.length);
Clip clip = AudioSystem.getClip();
clip.open(aisAccelerated);
clip.loop(2*playBackSpeed);
clip.start();
JOptionPane.showMessageDialog(null, "Exit?");
}
}
prompt> java AcceleratePlayback
Playback Rate: 1
URL: http://pscode.org/media/leftright.wav
End entire: Mon Apr 25 20:54:55 EST 2011
End sub-sample: Mon Apr 25 20:54:55 EST 2011
prompt> java AcceleratePlayback 2
Playback Rate: 2
URL: http://pscode.org/media/leftright.wav
End entire: Mon Apr 25 20:55:20 EST 2011
End sub-sample: Mon Apr 25 20:55:20 EST 2011
prompt> java AcceleratePlayback 3
Playback Rate: 3
URL: http://pscode.org/media/leftright.wav
End entire: Mon Apr 25 20:55:36 EST 2011
End sub-sample: Mon Apr 25 20:55:36 EST 2011
prompt>