public void play(String fileName) {
// 定义一个文本对象引用,指向名为fileName那个文件
File sourceFile = new File(fileName);
if (!sourceFile.exists()) {
System.out.println("音频文件不存在!");
return;
}
// 定义一个AudioInputStream用于接收输入的音频数据
AudioInputStream ais = null;
try {
System.out.println(sourceFile.getName());
System.out.println(sourceFile.getPath());
System.out.println(sourceFile);
// 用AudioSystem的getAudioInputStream方法获取指定File的音频输入流
ais = AudioSystem.getAudioInputStream(sourceFile);
} catch (UnsupportedAudioFileException e) {
System.out.println("File不指向系统识别的有效音频文件数据!");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 用AudioFormat来获取AudioInputStream的格式
AudioFormat format = ais.getFormat();
// 创建源数据行SourceDataLine,可以写入数据
SourceDataLine auline = null;
// 获取源数据行支持的音频格式DataLine.Info
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try {
// 获取与指定info类型相匹配的行
auline = (SourceDataLine) AudioSystem.getLine(info);
// 打开具有指定格式的行,使它变得可操作
auline.open();
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
auline.start();
// 写出数据
int nByteRead = 0;
byte[] abData = new byte[2];
while (nByteRead != -1) {
try {
// 从音频流读取指定的最大数量的数据字节
nByteRead = ais.read(abData, 0, abData.length);
if (nByteRead >= 0) {
// 用此源数据行写入数据到abData
auline.write(abData, 0, nByteRead);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
auline.drain();
auline.close();
}
}
}
错误来源:SourceDataLine auline = (SourceDataLine) AudioSystem.getLine(info)
错误原由:Exception in thread "main" java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format MPEG1L3 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, 38.28125 frames/second, is supported.
at javax.sound.sampled.AudioSystem.getLine(Unknown Source)