2015-06-19 69 views
0

我試圖部分地流MP3文件,但所有的要求「字節標誌」前字節STIL下載:如何部分流MP3文件

  • 假設MP3文件文件大小爲7000000字節。
  • 我「跳」到6000000字節,並從那裏開始流式傳輸到結尾。
  • 但我注意到,在從6000000字節標記播放mp3文件之前,正在下載1-5999999中的每個字節。
  • 我正在使用JLayer(Java Zoom - http://www.javazoom.net/javalayer/javalayer.html)播放mp3文件。

    import java.io.FileNotFoundException; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.net.MalformedURLException; 
    import java.net.URL; 
    import java.net.URLConnection; 
    import javazoom.jl.decoder.JavaLayerException; 
    import javazoom.jl.player.advanced.AdvancedPlayer; 
    
    try 
    { 
        URL url = new URL("http://somerandomsite.com/audiotestfile.mp3"); 
        URLConnection connection = url.openConnection(); 
        connection.connect(); 
    
        int fileSize = connection.getContentLength(); 
        InputStream inputStream = url.openStream(); 
    
        System.out.println("Filesize in bytes: " + fileSize); // Lets assume the filesize of the mp3 file is 7000000 bytes 
    
        long skippedBytes = inputStream.skip(6000000); // Skip to 6000000 bytes to only stream the file partially 
    
        System.out.println("Skipped bytes: " + skippedBytes); // The skipped bytes are equal to 6000000 bytes, but all previous bytes are still being downloaded. 
    
        AdvancedPlayer ap = new AdvancedPlayer(inputStream); 
        ap.play(); 
    } 
    catch (FileNotFoundException | JavaLayerException e) 
    { 
        System.out.println(e.getMessage()); 
    } 
    

如何流部分?

回答

0

我認爲你想要做的是讓服務器只從字節6000000向前發送給你,但是你的代碼實際上是下載整個流並簡單地忽略或跳過第一個6000000字節,就像你觀察到的那樣。

這是因爲InputStream.skip實際上讀入並忽略了您告訴它跳過的字節。從InputStream的文檔跳過:

此類的skip方法創建一個字節數組,然後重複讀入,直到讀取了n個字節或已到達流的末尾。

我認爲你實際上想要做的是從服務器請求它從mp3文件的第6000001字節開始流式傳輸給你。要做到這一點的方法之一是使用一種稱爲「字節服務」的概念:

  • 您的服務器表明它可以通過接受範圍,響應頭
  • 客戶端然後接受一個文件的一部分要求發送使用所述範圍請求報頭
  • 服務器與文件

的請求部分響應所述服務器的請求的文件的特定部分有該消息的一個例子來回流動到那裏服務器在這個答案 - 在這種情況下,它是一個mp4文件e但方法完全一樣:https://stackoverflow.com/a/8507991/334402