Javax.sound直接控制音频线路



有什么方法可以让我直接输入java中的音频Line,这样我就可以制作合成器了吗?

我尝试将二进制数据馈送到音频输入流。不起作用

当它不起作用时,我认为我输入了错误的数据,所以我得到了一个波形文件,并在弄清楚音频数据的位置后输入。

但它仍然没有起作用

这是源代码:

//audio.bin is just a .wav file
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.*;
import java.io.*;
import java.nio.file.Files;
public class main{
public static Mixer mixer;
public static Clip clip;
public static AudioInputStream audioStream;
public static InputStream inputStream;

public static void main(String[] args) throws IOException{
File file = new File("audio.bin");

byte[] files = Files.readAllBytes(file.toPath());

Mixer.Info[] mx = AudioSystem.getMixerInfo();
//for(int i=0;i<mx.length;i++){
//  System.out.println(i+"="+mx[i]);
//}
mixer = AudioSystem.getMixer(mx[0]);

//Port.Info.SPEAKER;
byte[] seq = new byte[files.length-0x56];
int j=0x56;
for(int i=0;i<seq.length;i++){
seq[i]=files[j];
j++;
//System.out.println(seq[i]);
}

inputStream = new ByteArrayInputStream(files);

AudioFormat format;
DataLine.Info dataInfo = new DataLine.Info(Clip.class, null);
try{
clip = (Clip)mixer.getLine(dataInfo);
format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100,16,2,4,44100,false);
audioStream = new AudioInputStream(inputStream,format,files.length);
clip.open(audioStream);
clip.start();
}catch(Exception e){
System.err.println(e);
}

}
}

/*





try{
clip = (Clip)mixer.getLine(dataInfo);
//AudioInputStream audioStream=;
//clip.Open();
}catch(Exception e){
System.out.println(e);
}
*/

如果您的目标是直接回放合成的音频数据,则应该使用类SourceDataLine进行输出,而不是Clip

例如,对于名为sdl的预定义SourceDataLine和名为缓冲区且大小为1024(选择任意大小(的Byte[]:

while(isPlaying)
{
buffer = getSomeAudioData();
sdl.write(buffer, 0, 1024);
}

呈现给SourceDataLine的音频数据必须符合打开SourceDataLine时使用的AudioFormat

最新更新