У меня проблемы с использованием аудио Java в Linux. Это OpenJDK 8 на Ubuntu 14.04. В следующем примере происходит сбой с файлом .wav по этой ссылке:
import java.net.URL;
import javax.sound.sampled.*;
public class PlaySound {
public void play() throws Exception
{
// List all mixers and default mixer
System.out.println("All mixers:");
for (Mixer.Info m : AudioSystem.getMixerInfo())
{
System.out.println(" " + m);
}
System.out.println("Default mixer: " + AudioSystem.getMixer(null).getMixerInfo());
URL url = getClass().getResource("drop.wav");
Clip clip;
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url);
clip = AudioSystem.getClip();
System.out.println("Clip format: " + clip.getFormat());
clip.open(audioInputStream);
clip.start();
do { Thread.sleep(100); } while (clip.isRunning());
}
public static void main(String [] args) throws Exception {
(new PlaySound()).play();
}
}
Вот результат:
All mixers:
PulseAudio Mixer, version 0.02
default [default], version 4.4.0-31-generic
Intel [plughw:0,0], version 4.4.0-31-generic
Intel [plughw:0,2], version 4.4.0-31-generic
NVidia [plughw:1,3], version 4.4.0-31-generic
NVidia [plughw:1,7], version 4.4.0-31-generic
NVidia [plughw:1,8], version 4.4.0-31-generic
NVidia [plughw:1,9], version 4.4.0-31-generic
Port Intel [hw:0], version 4.4.0-31-generic
Port NVidia [hw:1], version 4.4.0-31-generic
Default mixer: default [default], version 4.4.0-31-generic
Clip format: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
Exception in thread "main" java.lang.IllegalArgumentException: Invalid format
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.createStream(PulseAudioDataLine.java:142)
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:99)
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:283)
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:402)
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:453)
at PlaySound.play(PlaySound.java:22)
at PlaySound.main(PlaySound.java:29)
Видимо проблема в том, что выбирается микшер PulseAudio, и он по какой-то причине не может воспроизвести файл .wav.
Если я заменю вызов AudioSystem.getClip()
на AudioSystem.getClip(null)
, который выбирает микшер по умолчанию, тогда он сработает.
Как убедиться, что выбран совместимый микшер?
Обновление: Следуя предложению @Dave перебирать доступные микшеры, пока не найду тот, который имеет «совместимый» формат, я вижу следующее:
Целевой формат (от AudioInputStream.getFormat()
):
PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
Я перебираю все микшеры, исходные строки для каждого микшера и поддерживаемые форматы для каждой исходной строки и получаю следующее совпадение:
Mixer: PulseAudio Mixer, version 0.02
Source line: interface SourceDataLine supporting 42 audio formats, and buffers of 0 to 1000000 bytes
Format matches: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
Я действительно получаю совпадение (используя format.matches()
), но по-прежнему получаю исключение "Неверный формат". Возможно, потому что в совпадающем формате написано «Неизвестная частота дискретизации», а затем, когда я пытаюсь открыть клип, он обнаруживает, что на самом деле он не поддерживает 44100 Гц?
Clip
илиSourceDataLine
будет работать? Я понимаю, что ваш пример здесь, вероятно, просто минимальное воспроизведение проблемы, так что вам нужно искать или зацикливаться? - person Dave   schedule 20.09.2017