[英]Slow read from HttpUrlConnection's inputstream
我有一個鏈接到實時流的URL-實時流本身在“ .ts”文件中。
我正在使用vlcj使用Java顯示視頻,但是網絡代碼使用的是純Java。 這是我到目前為止的內容:
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.discovery.NativeDiscovery;
import uk.co.caprica.vlcj.player.media.callback.DefaultCallbackMedia;
public class Main {
public static class StreamMedia extends DefaultCallbackMedia{
private InputStream stream;
public StreamMedia(InputStream stream, String[] mediaOptions) {
//512 bytes to read per call to onRead
super(false, 512, mediaOptions);
this.stream = stream;
}
@Override
protected int onRead(byte[] arg0, int arg1) throws IOException {
int amnt = stream.read(arg0);
return amnt;
}
@Override
protected void onClose() {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected long onGetSize() {
return 0;
}
@Override
protected boolean onOpen() {
return true;
}
@Override
protected boolean onSeek(long arg0) {
return false;
}
}
public static void main(String[] args) throws Exception{
//The url I'm streaming to my machine.
//It's a ".ts" resource
URL url = new URL("STREAM URL");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setUseCaches(false);
connection.connect();
StreamMedia test = new StreamMedia(connection.getInputStream(), new String[0]);
//Just sets up my VLC JFrame. Right from the vlc tutorials
new NativeDiscovery().discover();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("A GUI");
frame.setBounds(100, 100, 600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
EmbeddedMediaPlayerComponent mediaPlayer = new EmbeddedMediaPlayerComponent();
frame.setContentPane(mediaPlayer);
frame.setVisible(true);
//play the StreamMedia object I've created
mediaPlayer.getMediaPlayer().playMedia(test);
}
});
}
}
主要瓶頸出現在StreamMedia類中的onRead()方法上,因為我的程序必須阻塞直到收到更多數據為止。 這會導致斷斷續續的播放並出現明顯的凍結。
但是,當我使用VLC程序播放流時,它可以很好地播放,因此我認為服務器沒有問題。
我曾嘗試過使用緩沖流,但是它只允許在初始階段進行流暢的播放。 我還嘗試過從輸入中讀取一個工作線程,而另一個則實際播放了該線程,但是沒有任何變化。
反正我可以解決這個問題? 謝謝。
完全不建議使用Java來讀取流的這種方法。
如果您要播放網絡流,請使用mediaPlayer.playMedia使用標准網絡MRL播放它。 因此,如果VLC可以播放您的流,請在使用vlcj時使用相同的MRL。
使用網絡流和.ts文件,您將需要處理vlcj中的子項目。 vlcj測試源中有許多播放網絡流的示例。
如果必須堅持這種方法,我不確定512字節是否適合緩沖區大小,因此可以嘗試增加該大小。 vlcj的默認緩沖區大小是10k,但是即使這樣,這種方法也不是很理想。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.