在写入文件时使用 restlet 流式传输文件



>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 分钟的小文件并按顺序播放它们,直到完成编码会起作用。

相关内容

  • 没有找到相关文章

最新更新