0

0

在Java中如何设计一个音乐播放器_Java音频处理与界面设计解析

P粉602998670

P粉602998670

发布时间:2026-02-06 08:13:02

|

955人浏览过

|

来源于php中文网

原创

Java原生不支持MP3播放,因AudioSystem仅内置PCM-WAV解码器;需用JLayer将MP3解码为PCM再交SourceDataLine输出,并在独立线程处理、EDT更新UI,避免依赖MediaPlayer以确保跨平台可控性。

在java中如何设计一个音乐播放器_java音频处理与界面设计解析

Java 原生不支持现代音频格式(如 MP3、FLAC)的直接播放,javax.sound.sampled 仅可靠处理 WAVAIF 等无压缩格式;想做实用音乐播放器,必须引入第三方库。

为什么 AudioSystem 无法直接播放 MP3

AudioSystem.getAudioInputStream() 对 MP3 文件通常抛出 UnsupportedAudioFileException,因为 JDK 自带的音频服务提供者(SPI)未内置 MP3 解码器。这不是代码写错,而是 JDK 设计限制——它只保证对 PCM-WAV 的开箱即用支持。

  • 尝试用 AudioSystem.getAudioInputStream(new File("song.mp3")) 必然失败
  • AudioFormatencoding 字段对 MP3 是 AudioFormat.Encoding.ULAW 或未知值,而非标准 PCM_SIGNED
  • 即使绕过异常强行读取,后续 SourceDataLine 写入会静音或崩溃

javazoom.jl 解码 MP3 并喂给 SourceDataLine

最轻量、最稳定的方案是使用 jl1.0.1(JLayer)解码 MP3 为 PCM 流,再交由 Java 声卡接口播放。注意:它只解码,不负责播放控制逻辑。

  • 添加 Maven 依赖:javazoomjl1.0.1
  • 关键步骤:用 Player 类解码 → 重写 writeAudioData 方法捕获 PCM 字节数组 → 转成 AudioFormat(采样率 44100、16 位、立体声、小端)→ 推入 SourceDataLine
  • 避免阻塞 UI:解码和写入必须放在单独线程,且需手动处理暂停/恢复(Player 本身无 pause 接口)
AudioFormat format = new AudioFormat(44100, 16, 2, true, false);
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
line.open(format);
line.start();
// 后续在循环中调用 line.write(decodedPcmBytes, 0, len)

Swing 界面中如何安全更新进度条与时间显示

音频解码线程不能直接操作 Swing 组件,否则触发 IllegalStateException: not on event dispatch thread。必须用 SwingUtilities.invokeLater() 包裹 UI 更新。

Image Creator
Image Creator

ImageCreator是Photoshop的免费AI插件,赋予艺术家强大的功能,如TXT2IMG、IMG2IMG、Fill和ControlNet。

下载

立即学习Java免费学习笔记(深入)”;

  • 不要在解码循环里写:progressBar.setValue(pos)timeLabel.setText("2:34")
  • 正确做法:计算当前播放毫秒数(基于已解码帧数 × 每帧毫秒),然后封装进 Runnable 提交到 EDT
  • 暂停时记得停止定时任务(如 TimerScheduledExecutorService),否则进度条会继续跑
  • 拖动进度条时,需重新定位 MP3 文件指针(InputStream.skip() 不可靠,应重建 FileInputStream + 重新初始化 Player

为什么不要用 JavaFX MediaPlayer 替代 Swing 方案

MediaPlayer 看似简单,但它依赖系统本地媒体框架(Windows 上是 Media Foundation,macOS 是 AVFoundation),在 Linux 或无图形环境极易失效,且无法细粒度控制缓冲、解码线程或 PCM 数据流。调试时常见错误:MediaException: UNKNOWN : com.sun.media.jfxmedia.MediaException: Could not create player!

  • 打包成 JAR 后,在没有安装 GStreamer 插件的 Linux 上几乎必挂
  • 无法获取实时 PCM 数据,做频谱分析或均衡器就无从下手
  • 播放控制(如精确跳转到毫秒级位置)响应延迟高,且 API 不透明

真正可控的播放器,得从字节流开始管起——解码、重采样、混音、输出,每一步都暴露在外,才谈得上“设计”,而不是调个 play() 就完事。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1261

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

275

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2196

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

34

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

609

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

87

2025.12.01

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

951

2023.07.26

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

7

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.5万人学习

Git 教程
Git 教程

共21课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号