欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用Java播放聲音

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 10:56 ? 次閱讀

在本篇文章中,我們將學(xué)習(xí)如何用Java播放音樂,Java 聲音 API 的設(shè)計是為了流暢和連續(xù)地播放聲音,甚至是很長的聲音。我們將使用 Java 提供的 ClipSourceDataLine 聲音API播放一個音頻文件。

播放聲音的Java APIs

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

Clip API

Clip API是Java的一個非緩沖或內(nèi)存聲音API。Clip類是javax.sound.sampled包的一部分,它在讀取和播放短的聲音文件時有用。在播放之前,整個音頻文件被加載到內(nèi)存中,用戶可以完全控制播放。除了循環(huán)播放聲音外,它還允許用戶在一個隨機的位置開始播放。

讓我們首先創(chuàng)建一個示例類,SoundPlayerWithClip,它實現(xiàn)了LineListener接口,以便接收播放的線事件(OPENCLOSE、STARTSTOP)。我們將從LineListener實現(xiàn)update()方法來檢查播放狀態(tài)。

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);

第三,從文件流中,我們將創(chuàng)建一個AudioInputStream。

AudioInputStream audioStream = AudioSystem.getAudioInputStream(inputStream);

現(xiàn)在,我們將創(chuàng)建一個DataLine.Info對象。

AudioFormat audioFormat = audioStream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);

讓我們從這個DataLine.Info創(chuàng)建一個Clip對象,并打開流,然后調(diào)用start來開始播放音頻。

Clip audioClip = (Clip) AudioSystem.getLine(info);
audioClip.addLineListener(this);
audioClip.open(audioStream);
audioClip.start();

最后,我們需要關(guān)閉任何開放的資源。

audioClip.close();
audioStream.close();

一旦代碼運行,音頻文件就會播放。

由于音頻被預(yù)裝在內(nèi)存中,我們有許多其他有用的API,我們可以從中受益。

我們可以使用Clip.loop方法來連續(xù)循環(huán)播放音頻片段。

例如,我們可以把它設(shè)置為播放五次音頻。

audioClip.loop(4);

或者,我們可以設(shè)置它無限期地播放音頻(或直到中斷)。

audioClip.loop(Clip.LOOP_CONTINUUSLY);

Clip.setMicrosecondPosition設(shè)置媒體位置。當(dāng)剪輯下次開始播放時,它將從這個位置開始。例如,要從第30秒開始,我們可以這樣設(shè)置。

audioClip.setMicrosecondPosition(30_000_000);

SourceDataLine API

SourceDataLine API是java的一個緩沖或流式聲音API。SourceDataLine類是javax.sound.sampled包的一部分,它可以播放無法預(yù)裝到內(nèi)存中的長聲音文件。

當(dāng)我們希望優(yōu)化大的音頻文件的內(nèi)存時,或者在流傳實時音頻數(shù)據(jù)時,使用SourceDataLine更有效。如果我們事先不知道聲音有多長,何時結(jié)束,它也很有用。

讓我們首先創(chuàng)建一個示例類,從我們項目的資源文件夾中讀取音頻文件。我們的資源文件夾包含三個不同格式的音頻文件--即WAV、MP3和MPEG。

InputStream inputStream = getClass().getClassLoader().getResourceAsStream(audioFilePath);

第二,從文件輸入流中,我們將創(chuàng)建一個AudioInputStream

AudioInputStream audioStream = AudioSystem.getAudioInputStream(inputStream);

現(xiàn)在,我們將創(chuàng)建一個DataLine.Info對象。

AudioFormat audioFormat = audioStream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);

讓我們從這個DataLine.Info創(chuàng)建一個SourceDataLine對象,打開流,并調(diào)用start來開始播放音頻。

SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(info);
sourceDataLine.open(audioFormat);
sourceDataLine.start();

現(xiàn)在,在SourceDataLine的情況下,的音頻數(shù)據(jù)是分塊加載的,我們需要提供緩沖區(qū)的大小。

private static final int BUFFER_SIZE = 4096;

現(xiàn)在,讓我們從AudioInputStream讀取音頻數(shù)據(jù),并將其發(fā)送到SourceDataLine的播放緩沖區(qū),直到它到達(dá)流的末端。

byte[] bufferBytes = new byte[BUFFER_SIZE];
int readBytes = -1;
while ((readBytes = audioStream.read(bufferBytes)) != -1) {
    sourceDataLine.write(bufferBytes, 0, readBytes);
}

最后,讓我們關(guān)閉任何開放的資源。

sourceDataLine.drain();
sourceDataLine.close();
audioStream.close();

一旦代碼運行,音頻文件就會播放。在這里,我們不需要實現(xiàn)任何LineListener接口。

ClipSourceDataLine之間的比較

讓我們來討論一下兩者的優(yōu)點和缺點。

ClipSourceDataLine
支持從音頻的任何位置播放。參見setMicrosecondPosition(long)setFramePosition(int).不能從聲音中的任意位置開始播放。
支持在循環(huán)中播放(全部或部分的聲音)。 參見setLoopPoints(int, int)loop(int).不能播放(循環(huán))全部或部分聲音。
可以在播放前知道聲音的持續(xù)時間。參見getFrameLength()getMicrosecondLength().在播放前不能知道聲音的持續(xù)時間。
可以在當(dāng)前位置停止播放,稍后繼續(xù)播放。請看stop()start()不能在中間停止和恢復(fù)播放。
不適合播放大的音頻文件,也沒有效率,因為它是在內(nèi)存中的。適合播放長的聲音文件或?qū)崟r的聲音流。
Clip的start()方法確實在播放聲音,但它不會阻塞當(dāng)前線程(它立即返回),所以它需要實現(xiàn)LineListener接口來了解播放狀態(tài)。與Clip不同,我們不需要實現(xiàn)LineListener接口來知道什么時候播放完成。
不可能控制什么聲音數(shù)據(jù)被寫入音頻線的播放緩沖區(qū)。可以控制哪些聲音數(shù)據(jù)要被寫入音頻線的播放緩沖區(qū)。

Java API對MP3格式的支持

目前,ClipSourceDataLine都可以播放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 ClipSourceDataLine 播放流行的音頻格式MP3/MPEG。`我們需要尋找一些能播放MP3格式的第三方庫。

如果我們向 ClipSourceDataLine 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)

總結(jié)

在這篇文章中,我們學(xué)習(xí)了如何用Java播放聲音。我們還了解了兩個不同的Java聲音API - ClipSourceDataLine。我們了解了 ClipSourceDataLine API之間的區(qū)別。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 音頻
    +關(guān)注

    關(guān)注

    29

    文章

    2907

    瀏覽量

    81975
  • 緩沖
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    17865
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3060

    瀏覽量

    74368
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2975

    瀏覽量

    105200
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1513

    瀏覽量

    62437
收藏 人收藏

    評論

    相關(guān)推薦

    ESP32-C5怎么播放聲音?

    我看了ESP32-C5的介紹,沒發(fā)現(xiàn)它有I2C和I2S,那怎么播放聲音?看到來ADF和它無關(guān)。
    發(fā)表于 06-28 08:29

    Tas5825pevm無法通過usb播放聲音怎么辦

    無法通過usb播放聲音 ppc顯示需要ID地址為0x98 但evm板ID為0x97 我該怎么修?
    發(fā)表于 10-09 07:11

    wince系統(tǒng)playsound單獨播放聲音正常,進(jìn)去地圖里面播放就有雜音的原因?

    地圖也是用playsound播放聲音,同樣的音頻文件,只是進(jìn)去地圖播放有雜音。在地圖播放聲音過程中cpu和內(nèi)存實用率都沒有超過50%。音頻芯片tlv320aic3106。
    發(fā)表于 10-29 06:05

    TPA3110無法播放聲音的原因?怎么解決?

    立刻重新制作了一塊新的板子,最后還是無法播放聲音。 在接下來的查找錯誤原因中,我們發(fā)現(xiàn)以下幾種有價值的情況: 1,首先,如果先在輸入端輸入音頻信號,再接通電源,板子可以短暫的播放一會音樂。但如果暫?;?/div>
    發(fā)表于 11-05 07:39

    C#中如何播放聲音

    C#中沒有聲音類。播放聲音請參閱API!比如:  [DllImport("Winmm.dll")]  
    發(fā)表于 02-20 10:22

    WinForm中如何播放聲音與Flash動畫

    WinForm中如何播放聲音與Flash動畫前面幾天有一位MM在論壇中問我,怎么在VC#設(shè)計中如何播放聲音和Flash動畫。當(dāng)時我正急著找工作,沒有機會去想想怎么做,只能遺憾對那個MM說,我?guī)筒涣四?/div>
    發(fā)表于 03-04 17:00

    VC播放聲音函數(shù)PlaySound和sndPlaySound的用法

    VC播放聲音函數(shù)PlaySound和sndPlaySound的用法一、PlaySound函數(shù)的聲明為:BOOL PlaySound(LPCSTR pszSound,HMODULE hmod
    發(fā)表于 10-02 01:51

    播放聲音

    自己編程的播放聲音文件的程序,分享相互學(xué)習(xí)。
    發(fā)表于 01-11 18:55

    LabVIEW播放聲音文件選擇設(shè)備ID無效?

    電腦有兩個聲卡,使用LabVIEW播放聲音文件的VI,無論設(shè)備ID設(shè)置0或1,都通過默認(rèn)的聲卡輸出聲音。即無法實現(xiàn)選擇輸出設(shè)備。而如果讀取波形文件控制播放時,則可以按照設(shè)備ID的選擇,通過不同的聲卡播出。但是
    發(fā)表于 09-13 15:01

    播放聲音直接從PSoC和發(fā)送同時有聲音失真

    我的英語道歉,不講起我用“谷歌翻譯”。試圖做一個樂器,必須傳送到計算機,這種風(fēng)格的“吉他英雄”的游戲,我的問題是,當(dāng)我嘗試播放聲音直接從PSoC和發(fā)送同時有聲音失真,思考這quice使用“操作系統(tǒng)
    發(fā)表于 01-17 12:53

    請問用edma方式播放聲音如何讓循環(huán)播放聲音停下來?

    想問兩個問題:1、AUDIO LINE OUT 例程中,用edma方式播放聲音,如何讓循環(huán)播放聲音停下來。做交互時很困擾,聲音一旦播放就停
    發(fā)表于 09-06 08:29

    求助大神自己設(shè)計咪頭聲音很大,錄音播放聲音很小

    自己在做一個基于ISD4004語音芯片的一個語音錄放裝置,不知道是哪里除了問題,在放音是總是很大雜音而錄音的播放聲音很小,請教一下各位大神們我的電路有什么問題嗎?
    發(fā)表于 07-16 08:30

    如何強制使用默認(rèn)聲卡播放聲音?

    如何強制使用默認(rèn)聲卡播放聲音?
    發(fā)表于 03-03 06:49

    java小應(yīng)用,java小應(yīng)用程序下載

    Java小應(yīng)用: 2.1 所有小應(yīng)用程序的根源 2.2 小試身手 2.3 圖形操作 2.4 URL類 2.5 載入現(xiàn)有圖像文件 2.6 動畫效果 2.7  播放聲音 2.8 小 
    發(fā)表于 04-28 14:20 ?0次下載

    JAVA教程之聲音播放程序

    JAVA教程之聲音播放程序,很好的JAVA的資料,快來學(xué)習(xí)吧
    發(fā)表于 04-11 17:14 ?5次下載