我正在尝试此代码,但是在测试5和测试9之后,该代码似乎在audioStream.write()
处停止运行。
没事
AudioSystem.write(audioStream, AudioFileFormat.Type.WAVE, audioFile);
由程序执行。如何解决此问题,或者还有另一种方式来记录我的声音?
import javax.sound.sampled.*;
import java.io.*;
public class Mic{
public static void main(String[] args){
System.out.println("Sound test starting");
try {
AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, false);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
if(!AudioSystem.isLineSupported(info))
{
System.err.println("Line is not supported");
}
final TargetDataLine targetLine = (TargetDataLine)AudioSystem.getLine(info);
targetLine.open();
System.out.println("Recording voice");
targetLine.start();
Thread thread = new Thread();
{
//@Override public void run();
{
AudioInputStream audioStream = new AudioInputStream(targetLine);
File audioFile = new File("Recording.wav");
System.out.println("test5");
try { System.out.println("test9");
AudioSystem.write(audioStream, AudioFileFormat.Type.WAVE, audioFile);
System.out.println("audio writing test");
}
catch(IOException e){
e.printStackTrace();
}
System.out.println("test6");
System.out.println("Recording Stopped");
}
};
thread.start();
Thread.sleep(5000);
targetLine.stop();
targetLine.close();
System.out.println("Ended sound test");
}
catch(InterruptedException ie){
ie.printStackTrace();
}
catch(LineUnavailableException e){
e.printStackTrace();
}
}
}
最佳答案
可能发生两种情况:
write
调用可能永远阻塞。 write
调用可能引发一些未经检查的异常,该异常未报告。 暂时更改此:
catch (IOException e) {
e.printStackTrace();
}
对此:
catch (Throwable e) {
e.printStackTrace();
}
并向我们显示现在获取输出的stacktrace(如果有)。
还有另外两种可能性:
您正在调用的
write
操作实际上是从audioStream
到文件的副本:audioStream
),则实际上可能会阻止write
从输入设备读取数据。 无论哪种方式,我接下来要做的都是在调试器下运行它,并尝试弄清
write
调用在(显然)被阻止时正在做什么。
关于java - 如何录制声音并将其设置为Java文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30825393/