java 音声 倍速 ソースコードの意味が分からない

該当のソースコード

こちらはjavaでwav音源の再生速度を変えるためのソースコードです。
このソースコードで意味が理解できないソースコードがあります。

java

1import java.io.ByteArrayInputStream;2import java.io.ByteArrayOutputStream;3import java.io.File;4import java.util.Arrays;5import java.util.Date;6 7import javax.sound.sampled.AudioFormat;8import javax.sound.sampled.AudioInputStream;9import javax.sound.sampled.AudioSystem;10import javax.sound.sampled.DataLine;11import javax.sound.sampled.Clip;12 13public class SoundTest {14 public static void main(String[] args) throws Exception {15 16 //この変数で音の速度を変更する17 //この設定では1.2倍速になる。18 double playBackSpeed = 1.0;19 20 System.out.println("Playback Rate: " + playBackSpeed); 21 File url = new File("C:\\Users\\novah\\Downloads\\-avzwwu4f7xzg1iil.wav");22 23 AudioInputStream ais = AudioSystem.getAudioInputStream(url);24 AudioFormat af = ais.getFormat();25 26 // 新しいAudioFormatを作成し、サンプルレートを変更27 AudioFormat newAf = new AudioFormat(af.getEncoding(), af.getSampleRate() / (float)playBackSpeed, af.getSampleSizeInBits(), af.getChannels(), af.getFrameSize(), af.getFrameRate(), af.isBigEndian());28 29 int frameSize = af.getFrameSize();30 31 ByteArrayOutputStream baos = new ByteArrayOutputStream();32 33 byte[] b = new byte[2^16];34 35 int read = 1;36 37 while( read > -1 ) {38 read = ais.read(b);39 if (read > 0) {40 baos.write(b, 0, read);41 }42 }43 44 byte[] b1 = baos.toByteArray();45 byte[] b2 = new byte[(int)((float)(b1.length/playBackSpeed))];46 for (int ii=0; ii<b2.length/frameSize; ii++) {47 for (int jj=0; jj<frameSize; jj++) {48 b2[(ii*frameSize)+jj] = b1[(int)(ii*frameSize*playBackSpeed)+jj];49 }50 }51 52 ByteArrayInputStream bais = new ByteArrayInputStream(b2);53 // 新しいAudioFormatを使用してAudioInputStreamを作成54 AudioInputStream aisAccelerated = new AudioInputStream(bais, newAf, b2.length);55 Clip c = AudioSystem.getClip();56 c.open(aisAccelerated);57 c.loop((int)(2*playBackSpeed));58 c.start();59 Thread.sleep(9000);60 61 }62}63

の中の

java

1for (int ii=0; ii<b2.length/frameSize; ii++) {2 for (int jj=0; jj<frameSize; jj++) {3 b2[(ii*frameSize)+jj] = b1[(int)(ii*frameSize*playBackSpeed)+jj];4 }5 }

の部分についてですが、

java

1for (int ii=0; ii<b2.length/frameSize; ii++) {2 for (int jj=0; jj<frameSize; jj++) {3 b2[(ii*frameSize)+jj] = b1[(int)(ii*frameSize*playBackSpeed)+jj*playBackSpeed];4 }5 }

が正しいと思うのですが、なぜそうならないのでしょうか?
音声を倍速にしたいのなら、単純に音声に関するビット情報を圧縮すればいいと思うのですが。
しかも、frameSizeが出てくる意味が理解できません。各フレームの
バイト数と何が関係あるのでしょうか?
Java Sound APIについて詳しい人は教えてほしいです。

コメントを投稿

0 コメント