Java 如何部分流式播放mp3文件

Java 如何部分流式播放mp3文件,java,streaming,mp3,Java,Streaming,Mp3,我正在尝试部分流式传输mp3文件,但请求的“字节标记”之前的所有字节仍在下载中: 让我们假设mp3文件的文件大小为7000000字节 我“跳转”到6000000字节,并从那里开始流到最后 但我注意到1-599999中的每个字节都是在从6000000字节开始播放mp3文件之前下载的 我正在使用JLayer(javazoom-)来播放mp3文件 import java.io.FileNotFoundException; import java.io.IOException; import java

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

  • 让我们假设mp3文件的文件大小为7000000字节
  • 我“跳转”到6000000字节,并从那里开始流到最后
  • 但我注意到1-599999中的每个字节都是在从6000000字节开始播放mp3文件之前下载的
  • 我正在使用JLayer(javazoom-)来播放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());
    }
    

如何部分流式传输?

我认为您想要做的是让服务器只从6000000字节开始向您发送数据,但您上面的代码实际上是下载整个流式传输,并简单地忽略或“跳过”前6000000字节,正如您所观察到的那样

这是因为InputStream.skip实际上是读入并忽略您告诉它要跳过的字节。从InputStream skip的文档中:

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

我认为您实际上想要做的是从服务器请求它从mp3文件的第6000001字节开始向您流式传输。一种方法是使用一种称为“字节服务”的概念:

  • 您的服务器指示它可以通过使用Accepts Ranges响应头来接受对文件部分的请求
  • 然后,客户机使用范围请求头向服务器发送文件特定部分的请求
  • 服务器使用文件的请求部分进行响应
在这个答案中有一个消息流来回到There服务器的示例-在本例中,它是针对mp4文件的,但方法完全相同: