>im 尝试通过 Java 库 Restlet 流式传输文件。但是文件在流式传输时被写入。这是它应该如何工作。
我创建一个视频和一个音频文件,然后将两个文件合并为一个,此步骤需要相当长的时间。因此,在创建新文件时,我想将文件流式传输到浏览器,无需等待 10 分钟即可观看视频。
目前,我可以使用FileInputStream读取文件块,但我不知道如何将文件提供给浏览器。有什么想法吗?
甚至可以使用 Restlet 提供动态文件吗?
提前感谢,很抱歉我的英语^^不好
齐姆蒂斯
[更新]
我能够在创建时播放mp3文件,这要归功于杰罗姆·卢维尔:
public class RestletStreamTest extends ServerResource {
private InputRepresentation inputRepresentation;
public FileInputStream fis;
@Get
public InputRepresentation readFile() throws IOException {
final File f = new File("/path/to/tile.mp3");
fis = new FileInputStream(f);
inputRepresentation = new InputRepresentation(new InputStream() {
private boolean waited = false;
@Override
public int read() throws IOException {
waited = false;
// read the next byte of the FileInputStream, when reaching the
// end of the file, wait for 2 seconds and try again, in case
// the file was not completely created yet
while (true) {
byte[] b = new byte[1];
if (fis.read(b, 0, 1) > 0) {
return b[0] + 256;
} else {
if (waited) {
return -1;
} else {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
waited = true;
}
}
}
}
}, MediaType.AUDIO_MPEG);
return inputRepresentation;
}
}
它有点生硬,但有效,稍后会改进。当我更改代码以尝试流式传输视频时,播放器会读取视频的所有字节,然后开始播放并再次读取所有字节。当我在视频完成后点击播放按钮时,什么也没发生。Restlet 抛出超时,然后视频再次开始播放。我尝试使用.mp4和.flv文件,但结果始终相同。
我不确定这是 Restlet 还是苍白器的问题。我在Firefox中使用VLC播放器,并在Chrome中尝试了标准的html5播放器。但是Chrome播放器甚至没有开始播放。
我错过了什么吗?还是只是玩家的问题?
我建议您尝试返回包装FileInputStream的InputRepresentation实例,或者直接返回包装新创建文件的FileRepresentation。
也许创建一个 1 分钟的小文件并按顺序播放它们,直到完成编码会起作用。