AudioInputStream из InputStream (загрузка из каталога ресурсов)
Я пытаюсь загрузить свои звуки из папки ресурсов, когда испытываю приложение в среде IDE.
Для изображений и других вещей, которые используют InputStreams, я использую этот метод:
@Override
public InputStream readAsset(String fileName) throws IOException {
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream(fileName);
return is;
}
это позволяет мне открыть входной поток, из которого я могу получить изображения.
Как только я пытаюсь преобразовать этот InputStream в Audio InputStream, я получаю ошибки. Также, если бы я попытался создать новый AudioInputStream, передав вышеупомянутый InputStream в качестве параметра.
Это мой текущий способ загрузки звуков с внешних путей:
public class JavaSound implements Sound {
private Clip clip;
public JavaSound(String fileName){
try {
File file = new File(fileName);
if (file.exists()) {
//for external storage Path
AudioInputStream sound = AudioSystem.getAudioInputStream(file);
// load the sound into memory (a Clip)
clip = AudioSystem.getClip();
clip.open(sound);
}
else {
throw new RuntimeException("Sound: file not found: " + fileName);
}
}
catch (MalformedURLException e) {
e.printStackTrace();
throw new RuntimeException("Sound: Malformed URL: " + e);
}
catch (UnsupportedAudioFileException e) {
e.printStackTrace();
throw new RuntimeException("Sound: Unsupported Audio File: " + e);
}
catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Sound: Input/Output Error: " + e);
}
catch (LineUnavailableException e) {
e.printStackTrace();
throw new RuntimeException("Sound: Line Unavailable Exception Error: " + e);
}
}
@Override
public void play(float volume) {
// Get the gain control from clip
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
// set the gain (between 0.0 and 1.0)
float gain = volume;
float dB = (float) (Math.log(gain) / Math.log(10.0) * 20.0);
gainControl.setValue(dB);
clip.setFramePosition(0); // Must always rewind!
clip.start();
}
@Override
public void dispose() {
clip.close();
}
}
Как я могу обменять часть AudioInputStream, чтобы она работала как первый код, вытаскивая файлы из моего каталога ресурсов?
РЕДАКТИРОВАТЬ: этот способ создания нового AudioInputStream путем передачи InputStream
File file = new File(fileName);
if (file.exists()) {
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream(fileName);
//for external storage Path
AudioInputStream sound = new AudioInputStream(is);
// load the sound into memory (a Clip)
clip = AudioSystem.getClip();
clip.open(sound);
}
также выдает ошибки, прежде чем даже запустить его
2 ответа
Это заставило его работать в моем коде выше:
public JavaSound(String fileName){
try {
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream(fileName);
AudioInputStream sound = AudioSystem.getAudioInputStream(new BufferedInputStream(is));
// load the sound into memory (a Clip)
clip = AudioSystem.getClip();
clip.open(sound);
}
catch (MalformedURLException e) {
e.printStackTrace();
throw new RuntimeException("Sound: Malformed URL: " + e);
}
catch (UnsupportedAudioFileException e) {
e.printStackTrace();
throw new RuntimeException("Sound: Unsupported Audio File: " + e);
}
catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Sound: Input/Output Error: " + e);
}
catch (LineUnavailableException e) {
e.printStackTrace();
throw new RuntimeException("Sound: Line Unavailable Exception Error: " + e);
}
}
просто нужно было начать новый bufferedInputStream с моим inputStream, чтобы AudioInputStream...:D все еще большое спасибо;)
Вы не можете разыграть InputStream
в AudioInputStream
(вы могли бы сделать обратное). Clip.open()
хочет AudioInputStream.
Подход, предлагаемый этим ответом здесь, состоит в том, чтобы использовать URL из .getResource()
вызов, а не пытаться открыть InputStream и затем передать его.
Поэтому попробуйте:
URL soundURL = classloader.getResource(fileName);
AudioInputStream ais = AudioSystem.getAudioInputStream(soundURL);