Java怎么实现暂停和继续播放 Java Sound API控制Clip播放状态【实例】

千宇姑娘_7588

千宇姑娘_7588

2026-01-18

426人浏览

原创

Clip不支持原生暂停/继续,需手动用setFramePosition()保存并恢复帧位置实现;PausableClip封装了该逻辑,但需确保clip已open且未close;JDK 17+在部分系统上可能存在兼容性问题。

java怎么实现暂停和继续播放 java sound api控制clip播放状态【实例】

Java Sound API 中 Clip 本身不支持暂停/继续,只能 stop() 和 start()

这是最常被误解的一点:Clip 接口没有 pause() 或 resume() 方法。调用 stop() 后,播放位置会重置到开头(除非手动保存并恢复),所以直接 start() 相当于从头播——这不是暂停继续,是重启。

实现“暂停/继续”的核心思路:手动记录并恢复 FramePosition

必须在 stop() 前读取当前帧位置,并在下次 start() 前用 setFramePosition(int) 跳转回去。注意:这个位置是帧数(frame),不是毫秒,需根据音频格式换算(但通常直接用帧数即可)。

  • clip.getFrameLength() 返回总帧数,可用于边界判断
  • clip.getMicrosecondPosition() 返回微秒位置,但精度依赖底层实现,不推荐用于恢复播放,因为 setMicrosecondPosition() 在某些 JDK 版本或系统上不可靠
  • 必须确保 clip.isOpen() 为 true 才能调用 setFramePosition()
  • 如果 clip 处于 STOPPED 状态但未关闭,setFramePosition() 仍有效;若已关闭(close()),则需重新打开(不现实),所以暂停期间绝不能 close()

一个可用的暂停/继续封装示例(含状态管理)

public class PausableClip {
    private Clip clip;
    private int lastFramePosition = 0;
    private boolean isPaused = false;

    public PausableClip(Clip clip) {
        this.clip = clip;
    }

    public void play() {
        if (clip.isRunning()) return;
        if (isPaused) {
            clip.setFramePosition(lastFramePosition);
            clip.start();
            isPaused = false;
        } else {
            clip.setFramePosition(0);
            clip.start();
        }
    }

    public void pause() {
        if (clip.isRunning()) {
            lastFramePosition = clip.getFramePosition();
            clip.stop();
            isPaused = true;
        }
    }

    public void stop() {
        clip.stop();
        clip.setFramePosition(0);
        isPaused = false;
    }

    public boolean isPlaying() { return clip.isRunning(); }
    public boolean isPaused() { return isPaused; }
}

使用时注意:clip 必须是已加载完成、已 open() 的实例;该类不处理异常(如 LineUnavailableException),实际项目中需包裹 try-catch。

替代方案:改用 SourceDataLine 可获得更精细控制

如果需要真正低延迟、可随时中断/续传、支持缓冲区级暂停(比如边解码边播放),Clip 就不合适了。SourceDataLine 允许你控制音频数据写入节奏:暂停时停止写入,继续时接着写——但这要求你自己管理音频解码、缓冲和同步,复杂度高得多。

Java 开发专家
Java 开发专家

精通 Java 21+,掌握虚拟线程、模式匹配和 Spring Boot 3.x 等现代特性。是 Java 生态系统(包括 GraalVM、Project Lo

下载

简单项目里硬套 Clip + 帧位置管理够用;但一旦涉及多段音频混合、变速、实时调节,就该考虑 SourceDataLine 或第三方库(如 TinySound、JavaFX MediaPlayer)。

容易被忽略的是:JDK 17+ 对 Clip 的部分实现有变更,某些 Linux ALSA 后端下 setFramePosition() 在 STOPPED 状态可能失效——务必在目标运行环境实测。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux java

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

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7599

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

3605

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

4748

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

3165

10

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

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

2023.10.19

3248

3

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

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

2025.10.17

5529

12

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

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

2025.12.29

3909

9

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

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

2026.01.19

506

15

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4590

4

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习