2015-06-19 70 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