Java Clip 播放音频

Java Clip 播放音频

  • 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/695143.shtml

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

相关文章

UE5 样条曲线(规划路径运动)

添加样条线&#xff08;第一种&#xff09; 添加样条线&#xff08;第二种&#xff09; 添加立方体 替换模型为人物动画模型 人物方向的调整

jmeter下载base64加密版pdf文件

一、何为base64加密版pdf文件 如下图所示&#xff0c;接口jmeter执行后&#xff0c;返回一串包含大小写英文字母、数字、、/、的长字符串&#xff0c;直接另存为pdf文件后&#xff0c;文件有大小&#xff0c;但是打不开&#xff1b;另存为doc文件后&#xff0c;打开可以看到和…

深入理解EPnP

本文是Jesse Chen的原创文章。 PnP问题是研究如何从3D-2D匹配对中求解摄像头位姿&#xff0c; EPnP算法是一种非迭代的PnP算法。本文作者用baidu搜索了“EPnP算法”时&#xff0c;能找到的中文介绍不多&#xff0c;而且这些网文并没有深入研究这个算法&#xff0c;找出这个算法…

ThreadLocal“你”真的了解吗?(二)

《ThreadLocal“你”真的了解吗&#xff1f;&#xff08;一&#xff09;》这篇文章梳理了ThreadLocal的基础知识&#xff0c;同时还梳理了java中线程的创建方法以及这两者之间的关系&#xff0c;本篇文章我们将继续梳理与ThreadLocal相关&#xff0c;在上一节也提过的另一组件T…

H5移动端文件预览pdf

H5移动端文件预览pdf 需求&#xff1a;H5页面嵌入浙政钉&#xff0c;需要文件预览Pdf。 试用了多个插件&#xff0c;踩了很多坑&#xff0c;如果小伙伴有类似填坑经历&#xff0c;并成功解决&#xff0c;感谢留言指点&#xff01;&#xff01;&#xff01; 先讲最终方案&#x…

一个诗词网站的设计与实现

诗词网 0、前言 ​  前段时间非常喜欢诗词&#xff0c;又恰逢想开发一个社区类的系统&#xff0c;于是便有将两者结合起来的构想&#xff0c;说干就干&#xff0c;便有了诗词网&#xff08;诗词社区系统&#xff09;这个项目。 ​  由于是利用空闲时间进行开发&#xff0c…

LeetCode | 寻找两个正序数组的中位数 Python C语言

Problem: 4. 寻找两个正序数组的中位数 文章目录 思路解题方法Code结果结果一些思考 思路 先合并&#xff0c;后排序&#xff0c;最后找中间轴。 解题方法 由解题思路可知 Code 这是python3的代码。 class Solution(object):def findMedianSortedArrays(self, nums1, num…

HTML---html面试题

1.src与href的区别 &#xff08;1&#xff09;使用元素不同&#xff1a;src表示源地址&#xff0c;用在img、script、iframe等元素上。href表示超文本引用&#xff0c;用在link和a等元素上。 &#xff08;2&#xff09;src的内容是页面必不可少的一部分&#xff0c;表示引入。h…

PyTorch深度学习实战(37)——CycleGAN详解与实现

PyTorch深度学习实战&#xff08;37&#xff09;——CycleGAN详解与实现 0. 前言1. CycleGAN 基本原理2. CycleGAN 模型分析3. 实现 CycleGAN小结系列链接 0. 前言 CycleGAN 是一种用于图像转换的生成对抗网络(Generative Adversarial Network, GAN)&#xff0c;可以在不需要配…

docker 安装Oracle19c

一、下载镜像 docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c通过docker images 命令查看 如下图&#xff1a;已经有oracle 19c镜像。 二、创建挂载文件 # 创建文件 mkdir -p /home/data/oracle/oradata# 授权&#xff0c;不授权会导致后面安装失败 c…

六西格玛培训揭秘:线上与线下费用差异背后的原因

在当今知识经济的时代&#xff0c;六西格玛作为一种先进的质量管理方法&#xff0c;受到越来越多企业和个人的青睐。然而&#xff0c;当我们在选择六西格玛培训时&#xff0c;不难发现线上和线下的培训费用存在明显的差异。那么&#xff0c;究竟是什么原因导致了这种差异呢&…

NDK的log.h使用__android_log_print报错app:buildCMakeDebug[x86_64]

org.gradle.api.tasks.TaskExecutionException: Execution failed for task :app:buildCMakeDebug[x86_64] 重点是 Execution failed for task :app:buildCMakeDebug[x86_64]. 我的代码&#xff1a; #include <android/log.h> #define LOG_TAG "MyJNI" #d…

【0261】pg内核 raw parsetree 深入分析(一)

1. 前言 pg内核完成原始解析树(raw parsetree)相关功能入口是exec_simple_query()函数中的pg_analyze_and_rewrite(),该函数位于postgres.c(src/backend/cop )。该函数内部有几个非常重要的函数调用处理: (1)pg_parse_query() 对一个或多个查询(原始字符串,如:SELE…

git reset --hard origin/master 文件被删除后的恢复操作

git reset --hard origin/master 是将你当前的工作目录重置为远程仓库&#xff08;origin&#xff09;的 master 分支的最新提交状态&#xff0c; 并且会丢弃所有未提交的修改以及本地的提交历史。这个命令将会强制更新你的工作目录&#xff0c; 使其与远程仓库的状态完全一致…

Spring Cloud Alibaba-04-Sentinel规则持久化Nacos方式-推荐

Lison <dreamlison@163.com>, v1.0.0, 2023.10.03 Spring Cloud Alibaba-04-Sentinel规则持久化全面Nacos方式 文章目录 Spring Cloud Alibaba-04-Sentinel规则持久化全面Nacos方式Sentinel-Dashboard 添加规则Nacos双向绑定实现注释掉test增加 NacosConfig配置加入Rep…

ElasticSearch聚合操作

目录 ElasticSearch聚合操作 基本语法 聚合的分类 后续示例数据 Metric Aggregation Bucket Aggregation ES聚合分析不精准原因分析 提高聚合精确度 ElasticSearch聚合操作 Elasticsearch除搜索以外&#xff0c;提供了针对ES 数据进行统计分析的功能。聚合(aggregation…

压缩感知中常用的稀疏基

稀疏基的基本概念 在压缩感知中&#xff0c;稀疏基是指可以将信号表示为少数几个非零系数的基。信号在这组基下的表示称为稀疏表示。理想情况下&#xff0c;信号在稀疏基下的大部分系数都应该为零&#xff0c;只有少数几个系数是非零的。稀疏基的选择对信号的稀疏表示和压缩感…

第3.4章:StarRocks数据导入-Routine Load

注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的Routine Load导入机制 一、概述 Routine Load&#xff08;例行导入&#xff09;支持用户提交一个常驻的导入任务&#xff0c;可以将消息流存储在 Kafka 的Topic中&#xff0c;通过订阅Topic 中的全部或部分分区的消息&#…

【备忘】云主机环境准备

文章目录 一&#xff0c;基础设置二&#xff0c;scp命令三&#xff0c;nginx相关 一&#xff0c;基础设置 #查看cpu cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c#查看os版本 cat /etc/redhat-release#升级所有包同时也升级软件和系统内核 yum -y updatehostnamect…

AN7525 集成锂电池充电管理和轻触三功能 LED 驱动专用芯片 实现全亮、25%亮、暴闪和灭 三种功能

AN7525是一款单片集成锂电池充电管理和轻触三功能 LED 驱动专用芯片。其内部集成了锂电池充电管理电路&#xff0c;可提供高达 600mA的充电电流:内部集成了高达 800m 的 LED 驱动电路&#xff0c;可驱动单颗 LED 实现全亮25%亮、暴闪和灭循环的轻触三功能切换控制。 AN…