本文目录导读:

- 核心 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 提供高层抽象,根据文件格式和功能复杂度选择即可。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播