在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用Java播放聲音

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

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

播放聲音的Java APIs

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

Clip API

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

讓我們首先創建一個示例類,SoundPlayerWithClip,它實現了LineListener接口,以便接收播放的線事件(OPENCLOSE、STARTSTOP)。我們將從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 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接口。

ClipSourceDataLine之間的比較

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

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

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)

總結

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 音頻
    +關注

    關注

    29

    文章

    2877

    瀏覽量

    81553
  • 緩沖
    +關注

    關注

    0

    文章

    52

    瀏覽量

    17823
  • 內存
    +關注

    關注

    8

    文章

    3025

    瀏覽量

    74056
  • JAVA
    +關注

    關注

    19

    文章

    2967

    瀏覽量

    104759
  • API
    API
    +關注

    關注

    2

    文章

    1501

    瀏覽量

    62026
收藏 人收藏

    評論

    相關推薦

    ESP32-C5怎么播放聲音?

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

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

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

    wince系統playsound單獨播放聲音正常,進去地圖里面播放就有雜音的原因?

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

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

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

    C#中如何播放聲音

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

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

    WinForm中如何播放聲音與Flash動畫前面幾天有一位MM在論壇中問我,怎么在VC#設計中如何播放聲音和Flash動畫。當時我正急著找工作,沒有機會去想想怎么做,只能遺憾對那個MM說,我幫不了你
    發表于 03-04 17:00

    VC播放聲音函數PlaySound和sndPlaySound的用法

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

    播放聲音

    自己編程的播放聲音文件的程序,分享相互學習。
    發表于 01-11 18:55

    LabVIEW播放聲音文件選擇設備ID無效?

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

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

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

    請問用edma方式播放聲音如何讓循環播放聲音停下來?

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

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

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

    如何強制使用默認聲卡播放聲音?

    如何強制使用默認聲卡播放聲音
    發表于 03-03 06:49

    java小應用,java小應用程序下載

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

    JAVA教程之聲音播放程序

    JAVA教程之聲音播放程序,很好的JAVA的資料,快來學習吧
    發表于 04-11 17:14 ?5次下載
    主站蜘蛛池模板: rrr523亚洲国产片| 俺去啦五月| 噜噜啪啪| 狠狠操综合| 欧美黄业| 人人澡人人搞| 男人j桶女人j免费视频| 一级黄色日本| 天堂网最新| www.xxx国产| 综合五月激情| 中国成人免费视频| 天堂网视频在线| 99综合色| 好大好硬好爽免费视频| 三级高清| 成 人 黄 色视频免费播放| 成人午夜在线观看国产| 亚洲第九页| 久久婷婷国产一区二区三区| 亚洲午夜精品久久久久久抢| 国产成人影视| 天堂资源吧| 亚洲理论视频| 老师你好大好白好紧好硬| 玖玖爱这里只有精品| 偷操| 精品国产成人三级在线观看| 黄色一级一毛片| 日本在线网站| 一区二区在线免费观看| 免费一级毛片视频| 天天做天天爱天天爽天天综合| 欧美性色黄大片四虎影视| 全国男人的天堂网站| 青青青久97在线观看香蕉| 亚洲综合色网| 五月天婷婷影院| 一级毛片一片毛| 亚洲午夜免费| 一级做受毛片免费大片|