本文目录导读:

- 核心 API:Java Sound(javax.sound.sampled)
- 录制音频(从麦克风)
- 播放 MP3(需第三方库)
- JavaFX MediaPlayer(推荐高级场景)
- 常见问题与解决
- 总结:选择哪个 API?
Java 主要提供两套音频 API:Java Sound API(核心,功能强大)和 JLayer(专用于 MP3),以下从基础播放到高级录音分层次说明。
核心 API:Java Sound(javax.sound.sampled)
播放 WAV/AU/AIFF 等未压缩音频
这是最基础的功能,适合播放 .wav 文件。
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
public class SimplePlayer {
public static void main(String[] args) {
try {
// 1. 获取音频输入流(支持 WAV/AU/AIFF)
File audioFile = new File("sound.wav");
AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);
// 2. 获取音频格式
AudioFormat format = audioStream.getFormat();
// 3. 创建数据行并打开
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(audioStream);
// 4. 播放&等待
clip.start();
Thread.sleep(clip.getMicrosecondLength() / 1000);
// 5. 清理
clip.close();
audioStream.close();
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException | InterruptedException e) {
e.printStackTrace();
}
}
}
循环播放(背景音乐)
clip.loop(Clip.LOOP_CONTINUOUSLY); // 无限循环 clip.loop(3); // 循环 4 次(原曲 + 重复 3 次)
音量控制(FloatControl)
// 假设 clip 已经 open
if (clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) {
FloatControl volume = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
float gain = -10.0f; // dB,负值减小音量,正值增大
volume.setValue(gain);
}
录制音频(从麦克风)
基本录音流程
import javax.sound.sampled.*;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
public class Recorder {
public static void main(String[] args) throws Exception {
// 1. 定义音频格式(CD 品质)
float sampleRate = 44100;
int sampleSizeInBits = 16;
int channels = 2; // 立体声
boolean signed = true;
boolean bigEndian = false;
AudioFormat format = new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
// 2. 获取 TargetDataLine(麦克风输入)
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
if (!AudioSystem.isLineSupported(info)) {
System.err.println("Line not supported");
System.exit(1);
}
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start(); // 开始录音
System.out.println("Recording... Press Enter to stop.");
System.in.read(); // 等待用户按回车
// 3. 停止录音,读取数据
line.stop();
line.close();
// 实际录音时,应在 line.start() 后另开线程持续读取:
// byte[] buffer = new byte[4096];
// while (recording) {
// int bytesRead = line.read(buffer, 0, buffer.length);
// // 写入文件或 ByteArrayOutputStream
// }
}
}
提示:录音需要持续读取数据,通常使用单独线程 +
ByteArrayOutputStream或直接写入文件。
播放 MP3(需第三方库)
Java Sound 原生不支持 MP3(版权限制),常用 JLayer 库。
添加依赖(Maven)
<dependency>
<groupId>javazoom</groupId>
<artifactId>jlayer</artifactId>
<version>1.0.1</version>
</dependency>
基本 MP3 播放
import javazoom.jl.player.Player;
import java.io.FileInputStream;
public class Mp3Player {
public static void main(String[] args) {
try {
FileInputStream fileStream = new FileInputStream("music.mp3");
Player player = new Player(fileStream);
player.play(); // 阻塞,直到播放结束
} catch (Exception e) {
e.printStackTrace();
}
}
}
进阶:暂停、音量控制(需配合 Java Sound)
JLayer 本身功能有限,推荐使用 JLayer + Java Sound 混流方案,或者直接使用 JavaFX MediaPlayer(功能更全)。
JavaFX MediaPlayer(推荐高级场景)
如果项目允许使用 JavaFX(桌面应用),MediaPlayer 支持 MP3、WAV、AAC 等,且提供暂停、音量、进度控制。
示例(JavaFX 应用)
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
import java.io.File;
public class FxPlayer extends Application {
@Override
public void start(Stage stage) {
String path = new File("music.mp3").toURI().toString();
Media media = new Media(path);
MediaPlayer player = new MediaPlayer(media);
Button playBtn = new Button("Play / Pause");
playBtn.setOnAction(e -> {
if (player.getStatus() == MediaPlayer.Status.PLAYING) {
player.pause();
} else {
player.play();
}
});
stage.setScene(new Scene(new StackPane(playBtn), 300, 200));
stage.show();
}
}
需要
module-info.java中添加requires javafx.media;,或者用普通 Java 项目并导入 JavaFX SDK。
常见问题与解决
UnsupportedAudioFileException
- 原因:文件不是 WAV/AU/AIFF 头格式,或者文件损坏。
- 解决:确认文件格式,用
AudioSystem.getAudioFileTypes()查看支持类型。
LineUnavailableException
- 原因:音频设备被占用或不存在。
- 解决:关闭其他使用麦克风/扬声器的程序,检查
Mixer设备列表。
播放时有爆音/卡顿
- 原因:缓冲区太小或线程阻塞。
- 解决:增大
Clip缓冲区(默认一般够用),录音时使用独立线程。
选择哪个 API?
| 场景 | 推荐方式 |
|---|---|
| 播放 WAV | Java Sound Clip |
| 播放 MP3 | JLayer 或 JavaFX MediaPlayer |
| 录音 | Java Sound TargetDataLine |
| 音效处理(混音/变速) | Java Sound SourceDataLine (实时流) |
| 桌面应用(含 UI) | JavaFX MediaPlayer(最简单) |
核心思路:Java Sound 处理底层音频流,JavaFX 提供高层抽象,根据文件格式和功能复杂度选择即可。