Java Clip 播放MP3音频

Java Clip 播放MP3音频

  • 1 依赖
  • 2 接口
  • 3 实现
  • 4 测试

项目Value
音频格式 添加依赖
*.wav(JDK 原生支持)
*.pcm(JDK 原生支持)
*.au(JDK 原生支持)
*.aiff(JDK 原生支持)
*.mp3mp3spi.jar
*.flacjflac-codec.jar

1 依赖

<dependency><groupId>com.googlecode.soundlibs</groupId><artifactId>mp3spi</artifactId><version>1.9.5.4</version>
</dependency><!-- 如果需要解码播放flac文件则引入这个jar包 -->
<dependency><groupId>org.jflac</groupId><artifactId>jflac-codec</artifactId><version>1.5.2</version>
</dependency>

2 接口

package com.xu.music.player.player;import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioInputStream;import java.io.File;
import java.net.URL;/*** Java 音频播放** @author hyacinth* @date 2019年10月31日19:06:39*/
public interface Player {/*** Java Music 加载音频** @param url 音频文件url* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(URL url) throws Exception;/*** Java Music 加载音频** @param file 音频文件* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(File file) throws Exception;/*** Java Music 加载音频** @param path 文件路径* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(String path) throws Exception;/*** Java Music 加载音频** @param stream 音频文件输入流* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(AudioInputStream stream) throws Exception;/*** Java Music 加载音频** @param encoding Encoding* @param stream   AudioInputStream* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(Encoding encoding, AudioInputStream stream) throws Exception;/*** Java Music 加载音频** @param format AudioFormat* @param stream AudioInputStream* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(AudioFormat format, AudioInputStream stream) throws Exception;/*** Java Music 暂停播放** @date 2019年10月31日19:06:39*/void pause();/*** Java Music 继续播放** @date 2019年10月31日19:06:39*/void resume();/*** Java Music 开始播放** @throws Exception 异常* @date 2019年10月31日19:06:39*/void play() throws Exception;/*** Java Music 结束播放** @description: Java Music 结束播放* @date 2019年10月31日19:06:39*/void stop();}

3 实现

package com.xu.music.player.player;import cn.hutool.core.text.CharSequenceUtil;
import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader;import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;import java.io.File;
import java.net.URL;/*** Java 音频播放** @author hyacinth* @date 2019年10月31日19:06:39*/
public class NPlayer implements Player {private Clip clip;private volatile long position = 0;private volatile boolean paused = false;private NPlayer() {}public static NPlayer createPlayer() {return NPlayer.SingletonHolder.player;}private static class SingletonHolder {private static final NPlayer player = new NPlayer();}@Overridepublic void load(URL url) throws Exception {load(AudioSystem.getAudioInputStream(url));}@Overridepublic void load(File file) throws Exception {String name = file.getName();if (CharSequenceUtil.endWithIgnoreCase(name, ".mp3")) {AudioInputStream stream = new MpegAudioFileReader().getAudioInputStream(file);AudioFormat format = stream.getFormat();format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), 16, format.getChannels(),format.getChannels() * 2, format.getSampleRate(), false);stream = AudioSystem.getAudioInputStream(format, stream);load(stream);} else if (CharSequenceUtil.endWithIgnoreCase(name, ".flac")) {AudioInputStream stream = AudioSystem.getAudioInputStream(file);AudioFormat format = stream.getFormat();format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), 16, format.getChannels(),format.getChannels() * 2, format.getSampleRate(), false);stream = AudioSystem.getAudioInputStream(format, stream);load(stream);} else {load(AudioSystem.getAudioInputStream(file));}}@Overridepublic void load(String path) throws Exception {load(new File(path));}@Overridepublic void load(AudioInputStream stream) throws Exception {DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(), AudioSystem.NOT_SPECIFIED);clip = (Clip) AudioSystem.getLine(info);clip.addLineListener(event -> {System.out.println(event.getType() + "\t" + event.getFramePosition());});clip.open(stream);}@Overridepublic void load(AudioFormat.Encoding encoding, AudioInputStream stream) throws Exception {load(AudioSystem.getAudioInputStream(encoding, stream));}@Overridepublic void load(AudioFormat format, AudioInputStream stream) throws Exception {load(AudioSystem.getAudioInputStream(format, stream));}@Overridepublic void pause() {if (clip != null && clip.isRunning()) {paused = true;position = clip.getMicrosecondPosition();clip.stop();}}@Overridepublic void resume() {if (clip != null && paused) {paused = false;clip.setMicrosecondPosition(position);clip.start();}}@Overridepublic void play() {if (clip != null) {clip.start();clip.drain();}}@Overridepublic void stop() {if (clip != null) {clip.stop();clip.close();}}}

4 测试

package com.xu.music.player.player;import java.io.File;/*** Java 音频播放** @author hyacinth* @date 2019年10月31日19:06:39*/
public class Test {public static void main(String[] args) throws Exception {Player player = new NPlayer();player.load(new File("D:\\Kugou\\梦涵 - 加减乘除.mp3"));player.play();Thread.sleep(5000);player.pause();Thread.sleep(5000);player.resume();Thread.sleep(5000);player. Stop();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python | OS模块操作

一、介绍 Python的os模块提供了许多与操作系统交互的函数&#xff0c;可以用于文件和目录的操作、进程管理、环境变量的访问等。以下是os模块的一些常用功能&#xff1a; 文件和目录操作&#xff1a;os模块提供了许多函数来进行文件和目录的操作&#xff0c;如创建文件夹(os.mk…

小红书如何写标题吸引人?

好奇类&#xff1a;利用观众得不到&#xff0c;没体验过的事物&#xff0c;激发好奇心 万能公式:&#xff08; )是一种什么体验&#xff1f; 例如:日入过千是一种什么体验? 极限类&#xff1a;将抽象的内容具象化&#xff0c;吸引力强&#xff0c;让观众引起重视 万能公式…

CQT新里程碑:SOC 2 数据安全认证通过,加强其人工智能支持

Covalent Network&#xff08;CQT&#xff09;发展新里程碑&#xff1a;SOC 2 数据安全认证通过&#xff0c;进一步加强了其人工智能支持 Covalent Network&#xff08;CQT&#xff09;现已完成并通过了严格的 Service Organization Control&#xff08;SOC) 2 Type II 的合规性…

物联网和人工智能的融合

物联网和人工智能的融合 1. 物联网和人工智能的融合2. 芯片技术的进步3. 安全和隐私保护挑战4. 软件开发和调试技术的创新5. 自动化和智能化趋势 1. 物联网和人工智能的融合 随着物联网和人工智能技术的快速发展&#xff0c;嵌入式系统将更多地与物联网设备和人工智能算法相结…

vivo 基于 StarRocks 构建实时大数据分析平台,为业务搭建数据桥梁

在大数据时代&#xff0c;数据分析和处理能力对于企业的决策和发展至关重要。 vivo 作为一家全球移动互联网智能终端公司&#xff0c;需要基于移动终端的制造、物流、销售等各个方面的数据进行分析以满足业务决策。 而随着公司数字化服务的演进&#xff0c;业务诉求和技术架构有…

ELK Stack 日志平台搭建

前言 最近在折腾 ELK 日志平台&#xff0c;它是 Elastic 公司推出的一整套日志收集、分析和展示的解决方案。 专门实操了一波&#xff0c;这玩意看起来简单&#xff0c;但是里面的流程步骤还是很多的&#xff0c;而且遇到了很多坑。在此记录和总结下。 本文亮点&#xff1a;…

windows系统中jenkins构建报错提示“拒绝访问”

一.背景 之前徒弟在windows中安装的jenkins,运行的时候用的是java -jar jenkins.war来运行的。服务器只有1个盘符C盘。今天说构建错误了&#xff0c;问我修改了啥&#xff0c;我年前是修改过构建思路的。 二.问题分析 先看jenkins构建任务的日志&#xff0c;大概是xcopy命令执…

【linux】使用g++调试内存泄露:AddressSanitizer

1、简介 AddressSanitizer(又名 ASan)是 C/C++ 的内存错误检测器。它可以用来检测: 释放后使用(悬空指针) 堆缓冲区溢出 堆栈缓冲区溢出 全局缓冲区溢出 在作用域之后使用 初始化顺序错误 内存泄漏这个工具非常快,只将被检测的程序速度减慢约2倍,而Valgrind将会是程序…

JavaScript:问号?的多种用法

文章目录 条件运算符 (三元运算符)可选链操作符 (?.)空值合并操作符 (??)逻辑赋值运算符&#xff08;?? &#xff09;补充&#xff1a;&#xff08;&&、||&#xff09; 正则表达式中 条件运算符 (三元运算符) 早在ES1&#xff08;ECMAScript 1st Edition&#xf…

word软件中硬件图像加速有什么用处?禁用硬件图形加速(G)会影响word文档中插入图片的分辨率吗?

问题描述&#xff1a;word软件中硬件图像加速有什么用处&#xff1f;禁用硬件图形加速(G)会影响word文档中插入图片的分辨率吗&#xff1f; 问题解答&#xff1a; 在 Microsoft Word 中&#xff0c;硬件图形加速主要用于提高图形元素的渲染速度和性能&#xff0c;特别是处理大…

FPS游戏之账号登录流程

在游戏开发中&#xff0c;账号登录的接入流程主要包含以下几个步骤&#xff1a; 创建账号系统&#xff1a;首先需要创建一个账号系统&#xff0c;能够让用户注册账号、登录账号以及找回和修改密码等。这个账号系统可以是自己开发的&#xff0c;也可以是接入的第三方服务如Goog…

如何添加或编辑自定义WordPress侧边栏

WordPress侧边栏是许多WordPress网站上的固定装置。它为您的内容提供了一个垂直空间&#xff0c;您可以在其中帮助读者导航、增加电子邮件列表或社交关注、展示广告等。 因为它是许多WordPress网站不可或缺的一部分&#xff0c;所以我们认为侧边栏值得拥有自己的大型指南。在这…

【leetcode题解C++】763.划分字母区间 and 56.合并区间 and 738.单调递增的数字

763. 划分字母区间 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的…

【AIGC】开源声音克隆GPT-SoVITS

GPT-SoVITS 是由 RVC 创始人 RVC-Boss 与 AI 声音转换技术专家 Rcell 共同开发的一款跨语言 TTS 克隆项目&#xff0c;被誉为“最强大中文声音克隆项目” 相比以往的声音克隆项目&#xff0c;GPT-SoVITS 对硬件配置的要求相对较低&#xff0c;一般只需 6GB 显存以上的 GPU 即可…

物体检测-系列教程8:YOLOV5 项目配置

1、项目配置 yolo的v1、v2、v3、v4这4个都有一篇对应的论文&#xff0c;而v5在算法上没有太大的改变&#xff0c;主要是对v4做了一个更好的工程化实现 1.1 环境配置 深度学习环境安装请参考&#xff1a;PyTorch 深度学习 开发环境搭建 全教程 要求torch版本>1.6&#xf…

HBASE学习九:数据写入 -> BulkLoad

1、功能 在实际生产环境中,有这样一种场景:用户数据位于HDFS中,业务需要定期将这部分海量数据导入HBase系统,以执行随机查询更新操作。这种场景如果调用写入API进行处理,极有可能会给RegionServer带来较大的写入压力: 引起RegionServer频繁f lush,进而不断compact、spl…

【Java EE初阶二十一】http的简单理解(二)

2. 深入学习http 2.5 关于referer Referer 描述了当前页面是从哪个页面跳转来的&#xff0c;如果是直接在地址栏输入 url(或者点击收藏夹中的按钮) 都是没有 Referer。如下图所示&#xff1a; HTTP 最大的问题在于"明文传输”,明文传输就容易被第三方获取并篡改. …

#gStore-weekly | gStore最新版1.2之新增内置高级函数详解(一)

gStore1.2版本新增了七个高级函数&#xff0c;我们第2期将继续介绍的高级函数为&#xff1a;整体/局部集聚系数&#xff08;clusterCoeff&#xff09;、鲁汶算法&#xff08;louvain&#xff09;、K跳计数&#xff08;kHopCount&#xff09;/K跳邻居&#xff08;kHopNeighbor&a…

Javaopp面向对象部分核心知识梳理

目录 前言&#xff1a; 一.面向对象和面向过程 面向过程 面向对象 面向过程与面向对象 二.类和对象 类 概念 成员变量&#xff08;静态成员变量 和 非静态成员变量&#xff09; 成员方法&#xff08;静态成员方法 和 非静态成员方法&#xff09; 代码块&#xff08;实…

React之拖动组件的设计(一)

春节终结束了&#xff0c;忙得我头疼。终于有时间弄自己的东西了。今天来写一个关于拖动的实例讲解。先看效果&#xff1a; 这是一个简单的组件设计&#xff0c;如果用原生的js设计就很简单&#xff0c;但在React中有些事件必须要多考虑一些。这是一个系列的文章&#xff0c;…