我正在尝试部分流式传输mp3文件,但所请求的“字节标记”之前的所有字节都是stil正在下载:
我正在使用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 :(得分:0)
我认为您要做的是让服务器仅从字节6000000开始向您发送,但上面的代码实际上是在下载整个流而只是忽略或“跳过”#39;你观察到的前6000000字节。
这是因为InputStream.skip本质上是读入并忽略了你告诉它跳过的字节。从InputStream的文档中跳过:
此类的skip方法创建一个字节数组,然后重复读入,直到读取了n个字节或者到达了流的末尾。
我认为你真正想做的是从服务器请求它从mp3文件中的第6000001个字节开始向你流式传输。一种方法是使用名为“Byte Serving'
的概念”在这个答案中有一个消息流来回到服务器的例子 - 在这种情况下它是用于mp4文件,但方法完全相同:https://stackoverflow.com/a/8507991/334402