代码直接可以运行
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
public class SystemDefaultAudioPlayer {
// 强制使用的通用音频格式
private static final AudioFormat FORCE_FORMAT = new AudioFormat(
44100.0f, // 采样率
16, // 位深度
2, // 声道(立体声)
true, // 有符号
false // 小端
);
public static void main(String[] args) {
// 解决控制台输出乱码
try {
System.setOut(new java.io.PrintStream(System.out, true, StandardCharsets.UTF_8.name()));
} catch (UnsupportedEncodingException e) {
System.err.println("设置编码失败: " + e.getMessage());
}
// 请先在系统中将默认音频输出设备设置为CABLE Output
System.out.println("注意:请确保已在系统中将默认音频输出设备设置为CABLE Output");
// 指定要播放的音频文件路径
String audioFilePath = "D:\\download\\语音合成模版.wav"; // 替换为你的音频文件路径
// 使用系统默认设备播放音频
playAudioWithSystemDefault(audioFilePath);
}
/**
* 使用系统默认音频设备播放音频文件
*/
private static void playAudioWithSystemDefault(String filePath) {
File audioFile = new File(filePath);
if (!audioFile.exists()) {
System.out.println("音频文件不存在: " + filePath);
return;
}
try {
// 获取原始音频输入流和格式
AudioInputStream originalAudioStream = AudioSystem.getAudioInputStream(audioFile);
AudioFormat originalFormat = originalAudioStream.getFormat();
System.out.println("原始音频格式: " + formatToString(originalFormat));
// 强制转换为通用格式
AudioInputStream convertedStream = AudioSystem.getAudioInputStream(FORCE_FORMAT, originalAudioStream);
System.out.println("已强制转换为通用格式: " + formatToString(FORCE_FORMAT));
// 获取系统默认的音频输出线路
DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class, FORCE_FORMAT);
SourceDataLine line = (SourceDataLine) AudioSystem.getLine(lineInfo);
line.open(FORCE_FORMAT);
line.start();
System.out.println("开始播放音频...");
// 播放音频数据
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = convertedStream.read(buffer)) != -1) {
line.write(buffer, 0, bytesRead);
}
// 完成播放
line.drain();
line.stop();
line.close();
convertedStream.close();
originalAudioStream.close();
System.out.println("音频播放完成");
} catch (UnsupportedAudioFileException e) {
System.out.println("不支持的音频文件格式: " + e.getMessage());
} catch (LineUnavailableException e) {
System.out.println("音频线路不可用: " + e.getMessage());
System.out.println("请尝试更换为其他音频格式或检查系统音频设备设置");
} catch (IOException e) {
System.out.println("文件操作错误: " + e.getMessage());
}
}
/**
* 将音频格式转换为易读字符串
*/
private static String formatToString(AudioFormat format) {
return String.format("%s, %.0f Hz, %d位, %s, %s",
format.getEncoding(),
format.getSampleRate(),
format.getSampleSizeInBits(),
format.getChannels() == 1 ? "单声道" : "立体声",
format.isBigEndian() ? "大端" : "小端");
}
}