Java 如何部分流式播放mp3文件
我正在尝试部分流式传输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文件的文件大小为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响应头来接受对文件部分的请求
- 然后,客户机使用范围请求头向服务器发送文件特定部分的请求
- 服务器使用文件的请求部分进行响应