0

我试图通过 Java 库 Restlet 流式传输文件。但是文件在流式传输时被写入。在这里它应该如何工作。

我创建了一个视频和一个音频文件,然后将这两个文件合并为一个,这一步需要相当长的时间。因此,在创建新文件时,我想将文件流式传输到浏览器,这样我就可以观看视频而无需等待 10 分钟。

目前我可以使用 FileInputStream 读取文件块,但我不知道如何将文件提供给浏览器。有任何想法吗?

甚至可以使用 Restlet 提供动态文件吗?

提前谢谢,对不起我的英语不好^^

津蒂斯

[更新]

感谢 Jerome Louvel,我能够在创建 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 还是 palyer 的问题。我在 Firefox 中使用 VLC 播放器,并在 Chrome 中尝试了标准的 html5 播放器。但是 Chrome 播放器甚至还没有开始播放。

我错过了什么吗?还是只是播放器的问题?

4

2 回答 2

1

我建议您尝试返回包装 FileInputStream 的 InputRepresentation 实例,或直接返回包装新创建文件的 FileRepresentation。

于 2013-10-01T01:13:27.593 回答
0

也许创建一个 1 分钟的小文件并按顺序播放它们,直到完成编码。

于 2013-10-06T05:22:29.173 回答