为了账号安全,请及时绑定邮箱和手机立即绑定

为什么尝试获取 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 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号