(извините, не говорящий по-английски, ожидайте много грамматических / синтаксических ошибок)
Я занимаюсь разработкой программного обеспечения для управления D-Link Ip Cam (DCS-xxxxсериалы и прочее).Поскольку эта камера предоставляет аудиопоток (в некоторых моделях даже имеется динамик для двунаправленной связи), я хотел бы воспроизвести его по запросу пользователя.
Все точки входа находятся за базовой аутентификацией http (но, как ни странно, я не могуиспользуйте http: \ USER: PASS@192.168.1.100, потому что я получаю 401).
Для этого я использую пакет javax.sound. *, но по какой-то причине звук начинает воспроизводиться после От 15 до 20 секунд, с общей задержкой 30-40 секунд EDIT : в среднем 45 секунд, но звук воспроизводится с самого начала, так что это еще хуже.
Это класс (минимум, только для целей тестирования)
import java.io.IOException;
import java.net.Authenticator;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.URL;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class AudioPlayer implements Runnable{
private URL URL;
private String USERNAME;
private String PASSWORD;
private volatile boolean stop = false;
public AudioPlayer(String url, String user, String pass) throws MalformedURLException{
this.URL = new URL(url);
this.USERNAME = user;
this.PASSWORD = pass;
}
public void shutdown() {
stop = true;
}
@Override
public void run() {
Authenticator.setDefault (new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication (USERNAME, PASSWORD.toCharArray());
}
});
try {
Clip clip = AudioSystem.getClip();
AudioInputStream inputStream = AudioSystem.getAudioInputStream(URL);
clip.open(inputStream);
clip.start();
while(!stop && clip.isRunning()) {}
clip.stop();
System.err.println("AUDIO PLAYER STOPPED");
} catch (LineUnavailableException | IOException | UnsupportedAudioFileException e) {
e.printStackTrace();
}
}
}
Требуется часть Authenticator, потому что ipcam использует базовую аутентификацию http.
Я прочиталгде-то, что AudioSystem
сделает несколько проходов с различным алгоритмом, чтобы получить правильный, затем сбросит поток в начало и только потом начнет играть.Поэтому, возможно, у AudioSystem
возникла проблема с пониманием того, какой тип кодека использовать (возможно, нужен какой-то заголовок), и он потратил довольно много времени, прежде чем начать проигрывать аудио.
Стоит знатьчто даже VLC изо всех сил старается не отставать от потоковой передачи, теряя до 8 секунд перед игрой (8 секунд лучше, чем 20).IpCam находится в локальной сети.
Что-то не так с моим кодом?Какой-то метод, которого я не вижу?
Действительно не знаю, где искать этот.
Мне не удалось найти какой-либо значимый ответ здесь или в другом месте.