簡體   English   中英

從HttpUrlConnection的inputstream讀取速度慢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM