如何部分流式传输mp3文件

时间:2015-06-19 21:43:06

标签: java streaming mp3

我正在尝试部分流式传输mp3文件,但所请求的“字节标记”之前的所有字节都是stil正在下载:

  • 我们假设mp3文件在filesize中是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());
    }
    

我如何部分流式传输?

1 个答案:

答案 0 :(得分:0)

我认为您要做的是让服务器仅从字节6000000开始向您发送,但上面的代码实际上是在下载整个流而只是忽略或“跳过”#39;你观察到的前6000000字节。

这是因为InputStream.skip本质上是读入并忽略了你告诉它跳过的字节。从InputStream的文档中跳过:

  

此类的skip方法创建一个字节数组,然后重复读入,直到读取了n个字节或者到达了流的末尾。

我认为你真正想做的是从服务器请求它从mp3文件中的第6000001个字节开始向你流式传输。一种方法是使用名为“Byte Serving'

的概念”
  • 您的服务器通过使用Accepts-Ranges响应标头表示它可以接受对文件的一部分的请求
  • 然后,客户端使用Range请求标头
  • 向服务器发送文件特定部分的请求
  • 服务器使用文件的请求部分进行响应

在这个答案中有一个消息流来回到服务器的例子 - 在这种情况下它是用于mp4文件,但方法完全相同:https://stackoverflow.com/a/8507991/334402