Java音频API怎么用?

wen python案例 1

本文目录导读:

Java音频API怎么用?

  1. 核心 API:Java Sound(javax.sound.sampled)
  2. 录制音频(从麦克风)
  3. 播放 MP3(需第三方库)
  4. JavaFX MediaPlayer(推荐高级场景)
  5. 常见问题与解决
  6. 总结:选择哪个 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 提供高层抽象,根据文件格式和功能复杂度选择即可。

抱歉,评论功能暂时关闭!