Java 录制麦克风到字节数组并播放声音
我想用Java制作一个实时语音聊天程序,但我对在Java中录制/播放声音一无所知,所以在Google的帮助下,我认为我已经能够从麦克风录制到字节数组,如下所示:
AudioFormat format = new AudioFormat(8000.0f, 16, 1, true, true);
TargetDataLine microphone;
try{
microphone = AudioSystem.getTargetDataLine(format);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
microphone = (TargetDataLine)AudioSystem.getLine(info);
microphone.open(format);
ByteArrayOutputStream out = new ByteArrayOutputStream();
int numBytesRead;
byte[] data = new byte[microphone.getBufferSize()/5];
microphone.start();
int bytesRead =0;
try{
while(bytesRead<100000){ //Just so I can test if recording my mic works...
numBytesRead = microphone.read(data, 0, data.length);
bytesRead = bytesRead + numBytesRead;
// System.out.println(bytesRead);
out.write(data, 0, numBytesRead);
}
catch(Exception e){
e.printStackTrace();
}
microphone.close();
catch(LineUnavailibleException e){
e.printStackTrace();
}
所以现在,据我所知,如果我喊出.toByteArray();,我应该得到一个字节数组,我刚刚从麦克风录制的声音。(我在运行上述内容时没有出现任何错误,但无法证明它是否实际记录,因为我不希望将其输出到文件并且没有这样做)
现在,如果上面是正确的,那么下面就是我遇到问题的地方:我现在想播放我刚刚创建的字节数组......(在我真正的程序中,我会通过Java套接字将字节发送到我的“接收程序”,我已经能够做到这一点,但现在我只想制作一个小程序来记录麦克风并播放它)。为了播放来自字节数组的声音信息,我遵循了这个:http://www.wikijava.org/wiki/Play_a_wave_sound_in_Java 并提出了以下内容:(它位于上面的micronic.close()之后)
try{
DataLine.Info info2 = DataLine.Info(SourceDataLine.class, format);
SourceDataLine dataLine = (SourceDataLine)AudioSystem.getLine(info2);
int bufferSize = 2200;
soundLine.open(format, bufferSize);
soundLine.start();
AudioInputStream audioInputStream = null;
InputStream input = new ByteArrayInputStream(out.toByteArray());
audioInputStream = AudioSystem.getAudioInputStream(input);
...
其余的几乎是从playSound复制粘贴的.java来自这个链接:http://www.wikijava.org/wiki/Play_a_wave_sound_in_Java
当我运行上面的代码时...录音似乎工作正常,但我得到以下错误:
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
对于此行audioInputStream = AudioSystem.getAudioInputStream(input);
根据我有限的知识,我假设这是因为我以某种方式搞砸了录音方法,我需要某种“音频格式标题?https://ccrma.stanford.edu/courses/422/projects/WaveFormat/(我以为我不需要这样的东西,因为我从未保存到文件中,只是将其全部保留为字节数组),或者我只是完全误解了java的AudioInputStream如何读取和解析数据......
这是我第一次在Java中使用任何与声音相关的东西,所以如果我完全误解并屠杀了这段代码,我很抱歉(是的,我知道代码看起来很糟糕而且没有组织,但我只是想让它工作)......我在Google / StackOverflow上尝试了多次搜索,并能够找到一个非常相似的问题:
但它也没有得到回答(唯一的答案是将其保存到文件中,但我们俩都想要的是将其直接流式传输为字节数组,而不会成为文件)
我所知道的:
可以使用TargetDataLine录制音频,并录制麦克风,该麦克风可以使用ByteArrayOutputStream输出到Byte Array。
音频可以保存到文件中,并使用 AudioInputStream 读取文件,并使用 SourceDataLine 播放数据。
如果我想写一个文件,我可以使用AudioSystem.write(new AudioInputStream(麦克风),AudioFileFormat.Type.WAVE,new File(“record.wav”); //我通过用这条线替换while循环来测试这一点,它录制得很好(除了它永远不会停止,所以我不得不手动终止它),但我不想那样,因为输出到文件意味着不可能通过插座将其实时发送到另一侧。
我不知道什么/我的问题:
如何使用Java录制从麦克风录制的音频并将其流式传输到另一台计算机,该计算机可以使用Java以尽可能少的延迟播放(非常类似于Skype的语音聊天)。
提前感谢您的任何帮助或可以向我指出正确方向的人。另外,如果有人知道更简单的方法,那么也请告诉我。