亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么嘗試獲取 Clip 會引發異常?

為什么嘗試獲取 Clip 會引發異常?

陪伴而非守候 2022-10-07 16:33:36
我一直在關注Java 1.7 的本教程,并且我確信我的代碼是正確的。但是,JavaIllegalArgumentException在運行時拋出一個。我試圖在現有的 catch 塊中捕獲它,使用 Java 稍微更新的多捕獲。但是,它只是拋出異常。這是我的代碼的開頭。      Mixer.Info[] mixInfos = AudioSystem.getMixerInfo();        /*        for (Mixer.Info info : mixInfos)        {            System.out.println(info.getName() + " - " + info.getDescription());        }        */        mixer = AudioSystem.getMixer(mixInfos[0]);        DataLine.Info dataInfo = new DataLine.Info(Clip.class, null);        try        {            clip = (Clip) mixer.getLine(dataInfo);        }我希望代碼將繼續運行并播放,Clip但我得到了這個異常:Exception in thread "main" java.lang.IllegalArgumentException: Line unsupported: interface Clip    at java.desktop/com.sun.media.sound.PortMixer.getLine(PortMixer.java:131)    at main.Driver.main(Driver.java:35)注意:如果這不向前兼容,請解釋。
查看完整描述

1 回答

?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

我認為你應該檢查你的進口。AFAIK,聲音庫都在 javax.sound.sampled 中。PortMixer 位于 com.sun.media.sound 中。


本教程的作者會遇到不必要的麻煩。您可以讓系統選擇默認值,而不是硬編碼特定的混音器。這可能是最好的策略,因為世界各地的 PC 將擁有不同的硬件配置。


以下是一個可能有用的示例。請注意,我們甚至不用費心去聲明一個 Mixer。


import java.io.IOException;

import java.net.URL;


import javax.sound.sampled.AudioInputStream;

import javax.sound.sampled.AudioSystem;

import javax.sound.sampled.Clip;

import javax.sound.sampled.DataLine;

import javax.sound.sampled.LineUnavailableException;

import javax.sound.sampled.UnsupportedAudioFileException;


public class BasicClipExample {


    public static void main(String[] args) {


        BasicClipExample bc = new BasicClipExample();


        try {

            bc.run();

        } catch (UnsupportedAudioFileException | IOException 

                | LineUnavailableException | InterruptedException e) {

            e.printStackTrace();

        }


    }


    private void run() throws UnsupportedAudioFileException, 

            IOException, LineUnavailableException, InterruptedException

    {

        String filename = "a3.wav";


        URL url = this.getClass().getResource("audio/" + filename);

        System.out.println(url);


        AudioInputStream ais = AudioSystem.getAudioInputStream(url);

        DataLine.Info info = new DataLine.Info(Clip.class, ais.getFormat());

        Clip clip = (Clip) AudioSystem.getLine(info);

        clip.open(ais);

        clip.start();

        Thread.sleep(6000);

        clip.close();

    }       

}

此示例假定您的音頻文件位于名為“/audio”的子目錄中。它還有一個睡眠命令,可以在播放剪輯時保持程序運行。Clips 在它們自己的線程下運行,但該線程是“守護進程”類型,不會阻止 Java 程序關閉。我的 a3.wav 是一個持續約 5 秒的鈴聲的錄音。


最后一件事,上面的代碼沒有以理想的方式使用 Clip。Clip 的概念是用于重復使用。每次播放之前重新加載剪輯變量是低效的。剪輯變量應該只加載一次,然后按需播放。如果您將 clip.open() 和 clip.start() 作為連續的代碼行,您可能應該使用 SourceDataLine 而不是 Clip,或者您應該重新編碼并將這兩個命令放入單獨的方法中。


查看完整回答
反對 回復 2022-10-07
  • 1 回答
  • 0 關注
  • 88 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號