使用Java播放MP3或Wav音频

2023-11-17

JavaSound是一个小巧的低层应用程序接口(API),它支持数字音频和乐器数字接口(MIDI)数据的记录和回放。在JDK 1.3.0之前,JavaSound是一个标准的Java扩展API,但从Java 2的1.3.0版开始,JavaSound就被包含到JDK之中。由于Java有着跨平台(操作系统、硬件平台)的特点,基于JavaSound的音频处理程序能够在任何实现了Java 1.3以上版本的系统上运行,无需加装任何支持软件。
使用JavaSound API,可以实现各种基于声音的应用,例如声音录制、音乐播放、网络电话、音乐编辑等。JavaSound API又以各种解码和合成器SPI(服务提供者接口,Service Provider Interface)为基础,实现各种音乐格式的解码与转码。
在处理输入音频时,对于来自各种音频输入端口的信号,例如麦克风、CD播放器、磁带播放器等,可以在它们到达TargetDataLine之前,利用混频器控制输入混频,最后在程序中通过TargetDataLine获得数字化的音频输入流。
类似地,在处理输出音频时,混频器用来对一系列来自SourceDataLine的数据进行混频处理,经处理后的信号可输出到各种输出端口,例如扬声器、耳机等。SourceDataLine是一个可写入音频信号数字流的设备,例如,我们可以从一个WAV文件读取内容写入到SourceDataLine,然后再通过扬声器输出。我们可以认为SourceDataLine是一个虚拟的播放器,只要电脑中连接的扬声器、耳机可用,音频信号就会经SourceDataLine进行播放。

但是,JavaSound只支持wav等格式的音频,它缺少对MP3格式音频文件的支持,想要使用Java代码播放MP3需要第三方库。JLayer-MP3 library是一款Java语言编写的开源MP3解码器库(jl1.0.jar),又称为javazoom.jl包。为了支持mp3的播放,我们必须添加mp3的SPI支持库(已包含JLayer-MP3 library)到当前项目中。mp3的SPI支持库共有三个Jar文件jl1.0.jar、mp3spi1.9.4.jar、tritonus_share.jar。

为了让Java程序能同时播放MP3格式和WAV等格式的音频,需要如图在当前项目的构建文件中添加mp3的SPI支持库:
在这里插入图片描述
下面是一个简单的播放例程,可兼容播放MP3和WAV音频,MP3 音频实际上是被转码为WAV格式了。

import java.io.File;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
public class AudioPlayTest {
	private AudioInputStream audioStream;
	private AudioFormat audioFormat;
	private SourceDataLine sourceDataLine;
	
	public AudioPlayTest(String path) {
		playMusic(path);
	}
	
	private void playMusic(String path){
		try{
			int count;
			byte buf[] = new byte[2048];
			//获取音频输入流
		    audioStream = AudioSystem.getAudioInputStream(new File(path));
			//获取音频格式
			audioFormat = audioStream.getFormat();
			
			System.out.println("音频文件: "+path);
			System.out.println("音频Encoding: "+audioFormat.getEncoding());
			
			//如果不是wav格式,转换mp3文件编码。MPEG1L3(mp3格式)转为PCM_SIGNED(wav格式)
			if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
				audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
						audioFormat.getSampleRate(), 16, audioFormat
						.getChannels(), audioFormat.getChannels() * 2,
						audioFormat.getSampleRate(), false);

				audioStream = AudioSystem.getAudioInputStream(audioFormat,
						audioStream);
			} //转换mp3文件编码结束
			//封装音频信息
			DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,
					audioFormat,AudioSystem.NOT_SPECIFIED);
			//获取虚拟扬声器(SourceDataLine)实例
			sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo);
			
			sourceDataLine.open(audioFormat);
			sourceDataLine.start();	
			//播放音频
			while((count = audioStream.read(buf,0,buf.length)) != -1){
				sourceDataLine.write(buf,0,count);			
			}
			//播放结束,释放资源
			sourceDataLine.drain();
			sourceDataLine.close();
			audioStream.close();
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		String path = "D:\\test\\三步舞曲.mp3";
		new AudioPlayTest(path);
		
		path = "D:\\test\\我是一片云.wav";
		new AudioPlayTest(path);
	}
}

实际上这个程序只是在"使用Java播放wav音乐"博客的第二种方案程序的基础上增加了一点对MP3格式音频的转码处理。请参见:
使用Java播放wav音乐_Java编程乐园的博客-CSDN博客

本例程的源码及相关的mp3的SPI支持库

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Java播放MP3或Wav音频 的相关文章

随机推荐

  • vba帮助手册chm_Excel 2010 VBA 离线帮助 简体中文版 本地帮助分享

    众所周知 Excel VBA帮助是我们写代码的好帮手 无论是初学者 还是VBA老鸟 很多问题都可以直接在VBA帮助里找到答案 但是坑爹的微软 在office2013以后 不再提供本地帮助 更重要的是 离线帮助非常不好用啊 但是高版本又有很多
  • 关于GTC

    目录 一 会议内容 二 AI技术 三 AI应用 四 AI前景 GTC GPU Technology Conference 是由英伟达 NVIDIA 主办的一场全球性的技术大会 旨在探讨人工智能 深度学习 自动驾驶等领域的最新技术 为参会者提
  • Shell自动补全传参简单demo

    准备两个文件 File1 env bash buildsh prompt COMPREPLY local cur COMP WORDS COMP CWORD local cmd COMP WORDS COMP CWORD 1 local o
  • 机器学习模型评价指标(准确率、精度、召回率)

    模型评价指标 准确率 精度 召回率 机器学习中我们常常使用准确率 精度 召回率三大指标评价一个模型训练的好坏 那么这三大参数分别代表什么意义 在介绍评价指标前 需要先明确几个计算指标 真正例 True Positive TP 模型将测试样本
  • Python报错:ImportError: cannot import name XXX

    Python报错 ImportError cannot import name XXX 起因 在使用sklearn部分包库时出现该问题 尝试多种方法无果 解释及解决方法 语句中涉及的包库和已安装的包库出现了版本不一致的问题 比如你导入的包库
  • python利用百度/高德地图获取地理位置并转换

    提示 作者原创 转载请注明 文章目录 一 地理编码与逆编码 二 高德地图地理编码 三 百度地图地理编码 四 坐标转换和空间化 一 地理编码与逆编码 地理编码与逆编码表示的是地名地址与地理坐标 经纬度 互相转换的过程 其中 将地址信息映射为地
  • tensorflow遇到的坑

    tensorflow遇到的坑 tf norm norm pow 2 tf pow tf norm from centralized axis 1 2 2 norm sqrt sum square tensor norm pow 2 tf r
  • 龙湖股价快速收复失地,近4日累计上涨27.8%

    11月7日早盘 龙湖集团股价快速冲高 截至10点 报13 1港元 对应涨幅为2 5 全面收付上周一深调失地 从近期表现来看 龙湖集团股价已连续反弹多日 截至上周五收盘 4个交易日内累计上涨27 8 在过去一周内 多家地产公司的波动令市场情绪
  • 手写数字的识别分类+技术总结

    1 学习转载一篇关于机器学习手写数字的识别 Python 3 利用机器学习模型 进行手写体数字检测 Python 3 生成手写体数字数据集 2 技术总结 机器学习代码实现的初级阶段 既要自己上手项目 也要多看其他前辈的博文 特别是一些附加有
  • 测试工程师要进阶,就得明白这3点...

    在大型互联网公司带测试团队多年 也做过多年的测试工程师招聘工作 对测试工程师的能力也见过高高低低各种 今天 分享下这些年带领测试团队提高的一点思路和方法 还在成长期的测试工程师可以用来指导自己的学习 用这套框架给自己制定一套目标和学习框架
  • Word、WPS中表格的第一行和第二行中间间距,如何去掉,使得跟其他行间距相同

    Word WPS中表格的第一行和第二行中间间距 如何去掉 使得跟其他行间距相同 Word或wps表格已经设计好了很多表格样式供大家使用 如图1 图1 当不想第一行和第二行的间距相同时 取消首行填充即可 如果不间距未变 再将首行删除必行
  • 嵌入式Linux开发笔记之手动设置交叉编译工具链

    快速索引 开发平台 拷贝交叉编译工具链到Linux主机 1 通过 MobaXterm 远程登录 Linux主机 安装交叉编译工具链 1 创建 imx6ull toolchain目录存放交叉编译工具链 2 解压交叉编译工具 3 设置工具链永久
  • 博弈论

    文章目录 博弈论 什么是博弈论 博弈的前提 博弈的要素 博弈的分类 非合作博弈 有限两人博弈囚徒困境 合作博弈 无限多人博弈囚徒困境 常见的博弈定律 零和博弈 重复博弈 智猪博弈 斗鸡博弈 猎鹿博弈 蜈蚣博弈 酒吧博弈 枪手博弈 警匪博弈
  • react使用阿里云对象存储,ali-oss, antd upload to ali-oss

    最近写阿里云图片上传 碰到一些小问题 在此总结一下 项目环境 create react app antd node6 1 0 看了阿里云oss对象存储sdk 直接采用node 的安装方式 在使用的时候碰到了问题 yield client p
  • Partial Evaluation

    Scrapping your Inefficient Engine Using Partial Evaluation to Improve Domain Specific Language Implementation AnyDSL A P
  • C++程序基础(15):C++while循环例题

    C while循环例题 前言 例题 1 1 含k个3的数 做法分析 完整代码演示 前言 通过上节的介绍 大家对while循环语句想必也有了一定的了解 那么在本篇中我们将来看一道较为复杂的例题 帮助大家巩固和进一步理解while循环语句 例题
  • 四大含金量高的算法证书考试

    证书考试推荐 一 PAT 计算机程序设计能力测试 二 CCF CSP认证 三 团体程序设计天梯赛 四 蓝桥杯大赛 一 PAT 计算机程序设计能力测试 官网 PAT 计算机程序设计能力测试 PAT为浙江大学出的一款程序设计的测试网站 分为乙级
  • 在VS里面怎么用scanf函数

    大家请看这个页面 认为scanf函数不安全 考虑使用scanf s替换 但是这个scanf s函数是VS这个IDE提供的 不是C语言标准库中的函数 这就意味着你在你代码中使用了scanf函数 你的代码在VS编译器上是不能通过编译的 如果不用
  • 【Linux学习笔记】管理Linux操作系统:简单的关闭防火墙

    临时关闭防火墙 命令查看防火墙状态 root rst firewall cmd state running 防火墙处于开启状态 停止防火墙 root rst systemctl stop firewalld service root rst
  • 使用Java播放MP3或Wav音频

    JavaSound是一个小巧的低层应用程序接口 API 它支持数字音频和乐器数字接口 MIDI 数据的记录和回放 在JDK 1 3 0之前 JavaSound是一个标准的Java扩展API 但从Java 2的1 3 0版开始 JavaSou