Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么尝试获取剪辑会引发异常?_Java_Javasound - Fatal编程技术网

Java 为什么尝试获取剪辑会引发异常?

Java 为什么尝试获取剪辑会引发异常?,java,javasound,Java,Javasound,我一直在跟踪,我确信我的代码是正确的。但是,Java在运行时抛出一个IllegalArgumentException 我尝试在现有的catch块中捕获它,使用Java稍新的multi-catch。然而,它只是抛出异常 这是我的代码的开头 Mixer.Info[]mixInfos=AudioSystem.getMixerInfo(); /* 用于(Mixer.Info:mixenfos) { System.out.println(info.getName()+“-”+info.getDescrip

我一直在跟踪,我确信我的代码是正确的。但是,Java在运行时抛出一个
IllegalArgumentException

我尝试在现有的catch块中捕获它,使用Java稍新的multi-catch。然而,它只是抛出异常

这是我的代码的开头

Mixer.Info[]mixInfos=AudioSystem.getMixerInfo();
/*
用于(Mixer.Info:mixenfos)
{
System.out.println(info.getName()+“-”+info.getDescription());
}
*/
mixer=AudioSystem.getMixer(mixInfos[0]);
DataLine.Info dataInfo=新的DataLine.Info(Clip.class,null);
尝试
{
clip=(clip)mixer.getLine(dataInfo);
}
我希望代码将继续运行并播放
剪辑
,但我得到了以下例外:

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)

注意:如果这是不向前兼容的,请解释。

我认为您应该检查您的导入。另外,声音库都在javax.sound.sampled中。PortMixer位于com.sun.media.sound中

本教程的作者将遇到比必要时多得多的麻烦。您可以让系统选择默认值,而不是硬编码特定的混音器。这可能是最好的策略,因为世界上的个人电脑将有不同的硬件配置

下面是一个可能有用的示例。请注意,我们甚至不需要声明混音器

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”的子目录中。 它还有一个sleep命令,在播放剪辑时保持程序运行。剪辑在自己的线程下运行,但线程是“守护程序”类型,不会阻止Java程序关闭。我的a3.wav是一个钟的录音,刚好持续5秒左右


最后,上面的代码没有以理想的方式使用剪辑。剪辑的概念是为了重复使用。在每次播放之前重新加载clip变量是低效的。clip变量只应加载一次,然后按需播放。如果将clip.open()和clip.start()作为连续的代码行,则可能应该使用SourceDataLine而不是clip,或者应该重新编码并将这两个命令放入单独的方法中。

另外,我使用的是JDK 11.0.2 try块中的哪一行是第35行
clip=(clip)mixer.getLine(dataInfo)
您可能会更幸运地删除mixer.Info和DataLine.Info代码,然后改用。发生了这样的情况:
线程“main”java.lang.IllegalArgumentException中的异常:不支持行:接口剪辑支持格式PCM\u签名未知采样率,16位,立体声,4字节/帧,big-endian位于java.desktop/com.sun.media.sound.PortMixer.getLine(PortMixer.java:131)的java.desktop/javax.sound.sampled.AudioSystem.getClip(AudioSystem.java:493)的main.Driver.main(Driver.java:26)