成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java播放本草綱目?你學廢了嗎?

開發 前端
在這篇文章中,我們學習了如何用Java播放聲音。我們還了解了兩個不同的Java聲音API - Clip? 和 SourceDataLine?。

大家好,我是指北君。

在本篇文章中,我們將學習如何用Java播放音樂,當下最火的本草綱目,用起來吧。Java 聲音 API 的設計是為了流暢和連續地播放聲音,甚至是很長的聲音。我們將使用 Java 提供的 Clip 和 SourceDataLine 聲音API播放一個音頻文件。

播放聲音的Java APIs

一般來說,javax.sound 包中的Java Sound APIs提供了兩種播放音頻的方法。在這兩種方法之間,在如何指定聲音文件數據方面有區別。Java Sound APIs可以以流式、緩沖方式和內存、非緩沖方式處理音頻傳輸。Java的兩個最著名的聲音API是 Clip 和 SourceDataLine。

Clip API

Clip 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。

nputStream 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 API

SourceDataLine 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之間的比較

讓我們來討論一下兩者的優點和缺點。

Clip

SourceDataLine

支持從音頻的任何位置播放。參見 ??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之間的區別。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2015-08-14 13:39:08

阿里云貝瑞

2020-12-17 08:39:36

Css前端html

2024-08-07 08:44:55

正則表達式格式字符串

2023-09-26 00:45:11

MySQL拆表分片

2024-09-02 08:00:00

2023-12-06 08:01:03

CSSPostCSS

2021-04-13 15:56:24

JavaPython技術

2022-02-09 23:02:53

Vuex開發管理模式

2024-01-19 08:25:38

死鎖Java通信

2023-12-06 08:28:44

禮物系統用例圖

2012-01-13 13:05:41

Scale Out網絡

2022-05-06 08:26:32

JavaSPI機制

2022-09-26 11:03:25

Java反射漏洞

2024-04-26 00:15:51

2023-01-28 09:50:17

java多線程代碼

2024-01-18 09:38:00

Java注解JDK5

2018-03-19 10:39:28

Java序列化對象

2009-06-22 14:36:09

ITIL運維管理摩卡軟件

2010-08-04 15:01:00

2012-08-29 09:44:20

免費增值
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av在线免费观看不卡 | 亚洲国产精品99久久久久久久久 | www成人免费视频 | 欧美精品二区三区 | 亚洲福利av | 91一区二区三区 | 午夜电影网址 | 午夜精品在线观看 | 少妇一级淫片aaaaaaaaa | 欧美一级免费看 | 午夜免费视频观看 | 精品国产91亚洲一区二区三区www | 国产成人精品一区二区三 | 亚洲精品久久久久久国产精华液 | 午夜在线| 国产农村妇女精品一二区 | 久久精品播放 | 夜夜艹天天干 | 中文在线观看视频 | 开操网 | 亚洲狠狠 | 色爱综合网 | 五月婷婷丁香婷婷 | 日韩视频免费看 | 国产精品美女久久久久aⅴ国产馆 | 一区二区三区精品在线视频 | 毛片一级片 | wwwww在线观看| 欧美日韩成人在线 | 天天综合成人网 | 亚洲免费精品一区 | 国产精品美女久久久免费 | 天天射天天干 | 国产一区二区三区在线 | 免费性视频| 久久久久无码国产精品一区 | 欧美日韩久久精品 | 国产精品久久久久久福利一牛影视 | 欧美一区二区三区免费电影 | 欧美在线不卡 | 欧美精品在线一区二区三区 |