讲师中心 微信公众号
AI工具推荐 视频效率加速

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

星宇同学_6481

星宇同学_6481

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

|

995人浏览过

|

来源于php中文网

原创

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

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

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

为什么 AudioSystem 无法直接播放 MP3

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

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

用 javazoom.jl 解码 MP3 并喂给 SourceDataLine

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

  • 添加 Maven 依赖:<dependency><groupid>javazoom</groupid><artifactid>jl</artifactid><version>1.0.1</version></dependency>
  • 关键步骤:用 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 更新。

Livestream Script Generator
Livestream Script Generator

直播带货脚本:话术、节奏、互动、促单。适用于主播、电商运营、MCN机构。

下载

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

  • 不要在解码循环里写:progressBar.setValue(pos) 或 timeLabel.setText("2:34")
  • 正确做法:计算当前播放毫秒数(基于已解码帧数 × 每帧毫秒),然后封装进 Runnable 提交到 EDT
  • 暂停时记得停止定时任务(如 Timer 或 ScheduledExecutorService),否则进度条会继续跑
  • 拖动进度条时,需重新定位 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() 就完事。

相关文章

PotPlayer播放器
PotPlayer播放器

potplayer是一款功能全面的视频播放器,支持各种格式的音频文件,内置了非常强大的解码器功能,能够非常流畅的观看,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
Java Maven专题
Java Maven专题

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

4220

2025.09.15

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

389

2026.05.09

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

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

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

3188

2023.10.19

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

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

5149

2025.10.17

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

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

3849

2025.12.29

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

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

486

2026.01.19

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

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

4498

2023.08.10

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn