当前位置: 首页 > news >正文

【JAVA】使用系统音频设置播放音频

代码直接可以运行

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 OutputSystem.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() ? "大端" : "小端");}
}
http://www.dtcms.com/a/325259.html

相关文章:

  • MyBatis执行器与ORM特性深度解析
  • React18 Transition特性详解
  • ARM汇编
  • Apache IoTDB 全场景部署:跨「端-边-云」的时序数据库 DB+AI 实战
  • 一维码+二维码+字符识别
  • 【数据结构】深入理解顺序表与通讯录项目的实现
  • 第十六届蓝桥杯大赛青少组 C++ 省赛真题解析(2025年8月10日)
  • 动态创建可变对象:Python类工厂函数深度解析
  • 云原生环境 Prometheus 企业级监控实战
  • 本地文件夹与 GitHub 远程仓库绑定并进行日常操作的完整命令流程
  • 时序数据库选型指南:Apache IoTDB为何成为工业物联网首选?
  • 精读:《DEEP OC-SORT: MULTI-PEDESTRIAN TRACKING BY ADAPTIVE RE-IDENTIFICATION》
  • 网安-安全加固
  • 安装jieba时遇到ModuleNotFoundError: No module named ‘distutils’
  • 2025世界机器人大会,多形态机器人开启商业化落地浪潮
  • stm32内存分析和RTOS任务切换分析
  • 第5节 大模型分布式推理通信优化与硬件协同
  • 高并发场景下分布式ID生成方案对比与实践指南
  • Web安全自动化测试实战指南:Python与Selenium在验证码处理中的应用
  • Redis知识点笔记
  • buildroot编译qt 5.9.8 arm64版本踩坑
  • 【车联网kafka】Kafka核心架构与实战经验(第三篇)
  • Java Web项目后台管理系统之内容管理仿写:内容、搜索、页码加载
  • 【Kafka系列】第三篇| 在哪些场景下会选择使用 Kafka?
  • 虚幻GAS底层原理解剖十 (网络)
  • 33-Hive SQL DML语法之查询数据-2
  • word的正则替换
  • 面试题-----微服务业务
  • 覆盖近 1.5 万个物种,谷歌 DeepMind 发布 Perch 2.0,刷新生物声学分类检测 SOTA
  • 深度学习与遥感入门(五)|GAT 构图消融 + 分块全图预测:更稳更快的高光谱图分类(PyTorch Geometric 实战)