我正在从麦克风录制声音并将其作为.wav文件保存到磁盘。
我无法使用Media Player播放wav文件?这是正常的吗?
AudioFormat format = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
44100.0F, 16, 2, 4, 44100.0F, false);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); // format is an AudioFormat object
// Obtain and open the line.
try {
targetLine = (TargetDataLine) AudioSystem.getLine(info);
targetLine.open(format);
targetLine.start();
ByteArrayOutputStream out = new ByteArrayOutputStream();
int numBytesRead;
byte[] data = new byte[targetLine.getBufferSize() / 5];
targetLine.start();
while (recording) {
numBytesRead = targetLine.read(data, 0, data.length);
out.write(data, 0, numBytesRead);
System.out.println(Arrays.toString(data));
}
File fileOut = new File("C:\\audio\\audio6.wav");
AudioInputStream ais = new AudioInputStream(targetLine);
if (AudioSystem. isFileTypeSupported(AudioFileFormat.Type.WAVE,ais)) {
AudioSystem.write(ais, AudioFileFormat.Type.WAVE, fileOut);
System.out.println("writen");
}
targetLine.stop();
ais.close();
答案 0 :(得分:0)
如果文件正常,您应该可以在媒体播放器中播放该文件。
我建议您获取免费音频编辑器Audacity(http://audacity.sourceforge.net/)的副本并查看数据。 首先检查文件中是否有一些数据,然后检查是否有正确的字节序,位深度和采样率(切换并查看是否有任何明显的噪音)。
如果这不起作用,请尝试从文件而不是Mic中读取一些样本,然后检查它们是否相同,当它们来到另一端时。
如果您还没有找到它,那么这对Java Audio来说是一个很好的资源 http://www.jsresources.org/
答案 1 :(得分:0)
您正在将记录的数据加载到ByteArrayOutputStream中,然后再对其进行任何操作(正如Jon Skeet所指出的那样)。
当“recording”布尔值为false时,那么您是否将TargetDataLine附加到AudioInputStream?但如果录音是假的,那么我假设没有数据通过TDL。数据通过read()方法从TDL获得,并且在while循环内。
我认为可以通过ByteArrayInputStream创建一个AIS,它可以从你用来从TDL收集数据的ByteArrayOutputStream中创建。
因此,在记录布尔值变为假之后,尝试以这种方式制作AIS:
ByteArrayInputStream bais = new ByteArrayInputStream(out.toByteArray());
AudioInputStream ais = new AudioInputStream(bais, format, baos.size());