当前位置: 首页 > 科技观察

java玩本草纲目?你没用吗?

时间:2023-03-14 01:12:17 科技观察

大家好,我是北军。在这篇文章中,我们将学习如何使用最流行的本草纲目Java播放音乐,让我们使用它。JavaSoundAPI是为平滑和连续播放声音而设计的,即使是很长的声音。我们将使用Java提供的Clip和SourceDataLine声音API播放音频文件。用于播放声音的JavaAPI通常,javax.sound包中的JavaSoundAPI提供了两种播放音频的方法。这两种方法在指定声音文件数据的方式上存在差异。JavaSoundAPI可以以流式、缓冲式和内存中非缓冲式的方式处理音频传输。两个最著名的Java声音API是Clip和SourceDataLine。ClipAPIClipAPI是一种用于Java的非缓冲或内存中声音API。Clip类是javax.sound.sampled包的一部分,对于读取和播放简短的声音文件很有用。在播放之前,整个音频文件被加载到内存中,用户可以完全控制播放。除了循环播放声音外,它还允许用户从随机位置开始播放。让我们首先创建一个示例类SoundPlayerWithClip,它实现了LineListener接口以接收播放线路事件(OPEN、CLOSE、START和STOP)。我们将从LineListener实现update()方法来检查播放状态。公共类SoundPlayerUsingClip实现LineListener{booleanisPlaybackCompleted;@Overridepublicvoidupdate(LineEventevent){if(LineEvent.Type.START==event.getType()){System.out.println("回放开始。");}elseif(LineEvent.Type.STOP==event.getType()){isPlaybackCompleted=true;System.out.println("播放完成。");其次,让我们从项目的资源文件夹中读取音频文件。我们的资源文件夹包含三种不同格式的音频文件-即WAV、MP3和MPEG。nputStreaminputStream=getClass().getClassLoader().getResourceAsStream(audioFilePath);第三,我们将从文件流中创建一个AudioInputStream。AudioInputStreamaudioStream=AudioSystem.getAudioInputStream(inputStream);现在,我们将创建一个DataLine.Info对象。AudioFormataudioFormat=audioStream.getFormat();DataLine.Infoinfo=newDataLine.Info(Clip.class,audioFormat);让我们从这个DataLine.Info创建一个Clip对象并打开流,然后调用start开始播放音频。剪辑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);SourceDataLineAPISourceDataLineAPI是用于java的缓冲区或流式声音API。SourceDataLine类是javax.sound.sampled包的一部分,可以播放无法预加载到内存中的长声音文件。当我们要优化大音频文件的内存,或者流式传输实时音频数据时,使用SourceDataLine会更有效。如果我们事先不知道声音持续多长时间以及何时结束,它也很有用。让我们从创建一个示例类开始,该类从我们项目的资源文件夹中读取音频文件。我们的资源文件夹包含三种不同格式的音频文件-即WAV、MP3和MPEG。InputStreaminputStream=getClass().getClassLoader().getResourceAsStream(audioFilePath);其次,我们将从文件输入流创建一个AudioInputStream。AudioInputStreamaudioStream=AudioSystem.getAudioInputStream(inputStream);现在,我们将创建一个DataLine.Info对象。AudioFormataudioFormat=audioStream.getFormat();DataLine.Infoinfo=newDataLine.Info(Clip.class,audioFormat);让我们从这个DataLine.Info创建一个SourceDataLine对象,打开流,然后调用start开始播放音频。SourceDataLinesourceDataLine=(SourceDataLine)AudioSystem.getLine(信息);sourceDataLine.open(audioFormat);sourceDataLine.start();现在,对于SourceDataLine,音频数据以块的形式加载,我们需要提供缓冲区的大小。私人静态最终intBUFFER_SIZE=4096;现在,让我们从AudioInputStream中读取音频数据并将其发送到SourceDataLine的播放缓冲区,直到它到达流的末尾。byte[]bufferBytes=newbyte[BUFFER_SIZE];intreadBytes=-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接口来知道播放何时完成。无法控制将哪些声音数据写入音频线的播放缓冲区。可以控制将哪些声音数据写入音频线的播放缓冲区。JavaAPI支持MP3格式目前Clip和SourceDataLine都可以播放AIFC、AIFF、AU、SND、WAV格式的音频文件。我们可以使用AudioSystem检查支持的音频格式。类型[]列表=AudioSystem.getAudioFileTypes();StringBuildersupportedFormat=newStringBuilder("支持的格式:");对于(类型类型:列表){supportedFormat.append(","+type.toString());}系统。out.println(supportedFormat.toString());但是,我们无法使用JavaSoundAPIsClip和SourceDataLine播放流行的音频格式MP3/MPEG。`我们需要找一些可以播放MP3格式的第三方库。如果我们向Clip或SourceDataLineAPI提供MP3格式的文件,我们将得到UnsupportedAudioFileException。javax.sound.sampled.UnsupportedAudioFileException:无法从位于javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1189)的输入文件获取音频输入流总结在本文中,我们学习了如何在Java中播放声音。我们还了解了两种不同的Java声音API-Clip和SourceDataLine。我们了解了Clip和SourceDataLineAPI之间的区别。