#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, либо вам следует перекодировать и поместить две команды в отдельные методы.