【问题标题】:Stream a file with restlet while it's being written to在写入文件时使用 restlet 流式传输文件
【发布时间】:2013-09-30 09:12:03
【问题描述】:

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

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

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

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

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

ZimTis

[更新]

感谢 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 播放器甚至还没有开始播放。

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

【问题讨论】:

    标签: java stream restlet live-streaming


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我能够加载文件,但遇到了一堆新问题。文件将加载到页面加载时正在写入的位置,然后在超时后重新开始,但这次有更多数据。如果我的声誉超过 15,那么您的回答肯定会得到 +1 ^^
    【解决方案2】:

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

    【讨论】:

    • 我也在想这个。这是一种选择,但需要在其他项目中进行大量重新编码。但我认为,如果切换到下一个剪辑是无缝的,没有黑框,没有暂停或其他任何情况,我会走他的路。
    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2013-05-04
    • 1970-01-01
    • 2011-01-03
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多