Я настраиваю медиаплеер с JavaFX, но он не будет воспроизводить звук из Интернета. Насколько я понял, было круто: буферизовать сначала 8192 байта, а затем воспроизвести их. Если я пытаюсь сделать это через MediaPlayer, он сначала загружает весь аудиофайл, затем начинает его воспроизведение. Как бы я реализовал альтернативу Android MediaPlayer#prepareAsync()
.
Я пробовал его с временным аудиофайлом, который я сохраняю в /tmp/
private byte[] streamToBytes(String streamPath) {
// Doesn't work with normal inputstream either
Response r = KHttp.get(streamPath);
return r.getContent();
}
byte[] tuneAsBytes = streamToBytes(url);
File tempWebm = File.createTempFile("play", ".webm", null); //, getCacheDir()
tempWebm.deleteOnExit();
FileOutputStream fos = new FileOutputStream(tempWebm);
fos.write(tuneAsBytes);
fos.close();
Media media = new Media(tempWebm.toURI().toURL().toString());
musicMV.setMediaPlayer(new MediaPlayer(media));
musicMV.getMediaPlayer().play();
Также пробовал использовать AudioClip
AudioClip ac = new AudioClip(tempWebm.toURI().toURL().toString());
ac.play();
Я зашел так далеко, что пытался открыть файлы с помощью WebView, но даже это не работает.
webView.getEngine().loadContent(audioUrl, "audio/webm");
webView.getEngine().getLoadWorker().stateProperty().addListener(
(observable, oldValue, newValue) -> {
System.out.println("oldValue: " + oldValue);
System.out.println("newValue: " + newValue);
if (newValue == Worker.State.SUCCEEDED) {
System.out.println("document finished loading");
}
}
);
Этот код просто выводит
oldValue: RUNNING
newValue: CANCELLED
Имейте в виду, что все URL-адреса могут быть открыты в браузере и работают нормально. Но URL-адреса не содержат расширений файлов, поэтому это может быть проблемой.
Я ожидал, что звук будет воспроизводиться через MediaView, но ничего не происходит или требуется очень много времени для загрузки всего мультимедиа.