Почему попытка получить исключение Clip throw?

#java #javasound

#java #javasound

Вопрос:

Я следил за этим руководством по Java 1.7, и я уверен, что у меня правильный код. Однако Java выдает IllegalArgumentException во время выполнения.

Я попытался перехватить его в существующем блоке catch, используя немного более новый multi-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. Кроме того, я использую JDK 11.0.2

2. Какая строка является строкой 35?

3. В блоке try. clip = (Clip) mixer.getLine(dataInfo)

4. Возможно, вам повезет больше, если вы удалите микшер. Информация и DataLine. Информационный код и просто использование AutioSystem.getClip() вместо этого.

5. Ну, это произошло: Exception in thread "main" java.lang.IllegalArgumentException: Line unsupported: interface Clip supporting format PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian at java.desktop/com.sun.media.sound.PortMixer.getLine(PortMixer.java:131) at java.desktop/javax.sound.sampled.AudioSystem.getClip(AudioSystem.java:493) at main.Driver.main(Driver.java:26)

Ответ №1:

Я думаю, вам следует проверить свой импорт. AFAIK, все библиотеки для звука находятся в javax.sound.sampled. Микшер портов находится в 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, чтобы программа продолжала работать во время воспроизведения клипа. Клипы выполняются в своем собственном потоке, но поток является типом «daemon» и не будет препятствовать закрытию Java-программы. Мой файл a3.wav представляет собой запись звонка, который длится около 5 секунд.

И последнее, приведенный выше код не использует клип идеальным образом. Концепция Clip заключается в том, что он предназначен для повторного использования. Перезагрузка переменной clip перед ее воспроизведением при каждом воспроизведении неэффективна. Переменная clip должна загружаться только один раз, а затем воспроизводиться по требованию. Если у вас есть clip.open() и clip.start() в виде непрерывных строк кода, вам, вероятно, следует либо использовать SourceDataLine вместо Clip, либо вам следует перекодировать и поместить две команды в отдельные методы.