【问题标题】:How to partially stream an mp3 file如何部分流式传输 mp3 文件
【发布时间】:2015-06-19 21:43:05
【问题描述】:

我正在尝试部分流式传输 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());
    }
    

如何进行部分流式传输?

【问题讨论】:

    标签: java streaming mp3


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 2014-01-28
      相关资源
      最近更新 更多