如何用Java播放声音

在本篇文章中,我们将学习如何用java播放音乐,java 声音 api 的设计是为了流畅和连续地播放声音,甚至是很长的声音。我们将使用 java 提供的 clip 和 sourcedataline 声音api播放一个音频文件。
播放声音的java apis一般来说,javax.sound 包中的java sound apis提供了两种播放音频的方法。在这两种方法之间,在如何指定声音文件数据方面有区别。java sound apis可以以流式、缓冲方式和内存、非缓冲方式处理音频传输。java的两个最著名的声音api是 clip 和 sourcedataline。
clip apiclip api是java的一个非缓冲或内存声音api。clip类是javax.sound.sampled包的一部分,它在读取和播放短的声音文件时有用。在播放之前,整个音频文件被加载到内存中,用户可以完全控制播放。除了循环播放声音外,它还允许用户在一个随机的位置开始播放。
让我们首先创建一个示例类,soundplayerwithclip,它实现了linelistener接口,以便接收播放的线事件(open、close、start和stop)。我们将从linelistener实现update()方法来检查播放状态。
public class soundplayerusingclip implements linelistener { boolean isplaybackcompleted; @override public void update(lineevent event) { if (lineevent.type.start == event.gettype()) { system.out.println(playback started.); } else if (lineevent.type.stop == event.gettype()) { isplaybackcompleted = true; system.out.println(playback completed.); } }}其次,让我们从我们项目的资源文件夹中读取音频文件。我们的资源文件夹包含三个不同格式的音频文件--即wav、mp3和mpeg。
inputstream inputstream = getclass().getclassloader().getresourceasstream(audiofilepath);第三,从文件流中,我们将创建一个audioinputstream。
audioinputstream audiostream = audiosystem.getaudioinputstream(inputstream);现在,我们将创建一个dataline.info对象。
audioformat audioformat = audiostream.getformat();dataline.info info = new dataline.info(clip.class, audioformat);让我们从这个dataline.info创建一个clip对象,并打开流,然后调用start来开始播放音频。
clip audioclip = (clip) audiosystem.getline(info);audioclip.addlinelistener(this);audioclip.open(audiostream);audioclip.start();最后,我们需要关闭任何开放的资源。
audioclip.close();audiostream.close();一旦代码运行,音频文件就会播放。
由于音频被预装在内存中,我们有许多其他有用的api,我们可以从中受益。
我们可以使用clip.loop方法来连续循环播放音频片段。
例如,我们可以把它设置为播放五次音频。
audioclip.loop(4);或者,我们可以设置它无限期地播放音频(或直到中断)。
audioclip.loop(clip.loop_continuusly);clip.setmicrosecondposition设置媒体位置。当剪辑下次开始播放时,它将从这个位置开始。例如,要从第30秒开始,我们可以这样设置。
audioclip.setmicrosecondposition(30_000_000);sourcedataline apisourcedataline api是java的一个缓冲或流式声音api。sourcedataline类是javax.sound.sampled包的一部分,它可以播放无法预装到内存中的长声音文件。
当我们希望优化大的音频文件的内存时,或者在流传实时音频数据时,使用sourcedataline更有效。如果我们事先不知道声音有多长,何时结束,它也很有用。
让我们首先创建一个示例类,从我们项目的资源文件夹中读取音频文件。我们的资源文件夹包含三个不同格式的音频文件--即wav、mp3和mpeg。
inputstream inputstream = getclass().getclassloader().getresourceasstream(audiofilepath);第二,从文件输入流中,我们将创建一个audioinputstream。
audioinputstream audiostream = audiosystem.getaudioinputstream(inputstream);现在,我们将创建一个dataline.info对象。
audioformat audioformat = audiostream.getformat();dataline.info info = new dataline.info(clip.class, audioformat);让我们从这个dataline.info创建一个sourcedataline对象,打开流,并调用start来开始播放音频。
sourcedataline sourcedataline = (sourcedataline) audiosystem.getline(info);sourcedataline.open(audioformat);sourcedataline.start();现在,在sourcedataline的情况下,的音频数据是分块加载的,我们需要提供缓冲区的大小。
private static final int buffer_size = 4096;现在,让我们从audioinputstream读取音频数据,并将其发送到sourcedataline的播放缓冲区,直到它到达流的末端。
byte[] bufferbytes = new byte[buffer_size];int readbytes = -1;while ((readbytes = audiostream.read(bufferbytes)) != -1) { sourcedataline.write(bufferbytes, 0, readbytes);}最后,让我们关闭任何开放的资源。
sourcedataline.drain();sourcedataline.close();audiostream.close();一旦代码运行,音频文件就会播放。在这里,我们不需要实现任何linelistener接口。
clip和sourcedataline之间的比较让我们来讨论一下两者的优点和缺点。
clipsourcedataline
支持从音频的任何位置播放。参见setmicrosecondposition(long)或setframeposition(int). 不能从声音中的任意位置开始播放。
支持在循环中播放(全部或部分的声音)。 参见setlooppoints(int, int)和loop(int). 不能播放(循环)全部或部分声音。
可以在播放前知道声音的持续时间。参见getframelength()或getmicrosecondlength(). 在播放前不能知道声音的持续时间。
可以在当前位置停止播放,稍后继续播放。请看stop()和start() 不能在中间停止和恢复播放。
不适合播放大的音频文件,也没有效率,因为它是在内存中的。 适合播放长的声音文件或实时的声音流。
clip的start()方法确实在播放声音,但它不会阻塞当前线程(它立即返回),所以它需要实现linelistener接口来了解播放状态。 与clip不同,我们不需要实现linelistener接口来知道什么时候播放完成。
不可能控制什么声音数据被写入音频线的播放缓冲区。 可以控制哪些声音数据要被写入音频线的播放缓冲区。
java api对mp3格式的支持目前,clip和sourcedataline都可以播放aifc、aiff、au、snd和wav格式的音频文件。
我们可以使用audiosystem检查支持的音频格式。
type[] list = audiosystem.getaudiofiletypes(); stringbuilder supportedformat = new stringbuilder(supported formats:); for (type type : list) { supportedformat.append(, + type.tostring()); } system.out.println(supportedformat.tostring());然而,我们不能用java sound apis clip 和 sourcedataline 播放流行的音频格式mp3/mpeg。`我们需要寻找一些能播放mp3格式的第三方库。
如果我们向 clip 或 sourcedataline api提供mp3格式的文件,我们会得到unsupportedaudiofileexception 。
javax.sound.sampled.unsupportedaudiofileexception: could not get audio input stream from input file at javax.sound.sampled.audiosystem.getaudioinputstream(audiosystem.java:1189)总结在这篇文章中,我们学习了如何用java播放声音。我们还了解了两个不同的java声音api - clip 和 sourcedataline。我们了解了 clip 和 sourcedataline api之间的区别。

运营商的套餐价格出炉,模仿有线宽带的收费模式
ADuM4135栅极驱动器与APTGT75A120 IGBT的结合使用
6g网络速度有多快
关于仅重195g频谱仪的接收机探头特点介绍
大规模投资电网发展方式将难以为继
如何用Java播放声音
基于电磁感应的车载无线手机充电方案
先进制程一马当先 台积20奈米年底试产
关于低功耗MCU技术对物联网市场的影响分析
AI Pin:一个独特的虚拟助手和通讯设备
今年日本全产业设备投资计划将首次突破2100亿美元
苹果13promax模型,iphone13promax参数配置
2019中国电信重庆公司科技节正式开幕
精极科技工业互联网 赋能企业低成本自动化发展
Matlab用导数作定性分析
联通落地千兆无线网络 保障新区通信服务
瑞浦兰钧320Ah大容量电芯“出战”大储市场
大冰柜压缩机电容器是什么,它有哪些特点
叠叠乐机器人展示了之前的机器人系统无法做到的事
三星S8发布会、价格、配置全曝光:全面屏+面部识别,仅5200元!