2

我的应用程序正在使用Java Play 2.0.4,我需要实现一个控制器,该控制器调用一个 Web 服务(托管在同一主机上的另一台服务器上),它返回一个视频,通常是大尺寸的。我不确定它是否相关,但视频是 m4v/mp4 格式。

执行此操作的正确方法是什么?我怀疑使用AsyncResult是正确的,但我不知道如何解决它。

目前,我正在调用 Web 服务并通过以下方式获得 Promise:

Promise<Response> promise = WS.url(videoUrl).get();

之后,我只是将响应作为字节获取,手动设置标头并将其返回到视图:

Response response = promise.value().get();
byte[] video = response.ahcResponse().getResponseBodyAsBytes();
response().setContentType(format.equals("m4v") ? "video/x-m4v" : "application/x-shockwave-flash");
response().setHeader("Accept-Ranges", "bytes");
response().setHeader("Content-Range", "bytes 0-" + String.valueOf(video.length-1) + "/" + String.valueOf(video.length));
return ok(video);

这有时有效,但是行为非常不稳定。一些(较短的)视频加载得很好。由于请求被取消,较大的视频会失败。我还注意到对调用 Web 服务的操作的请求被多次发出。始终返回完整的视频长度(或在请求取消之前可以加载的内容)。

我还可以添加我从srchtml5video标记的属性调用操作,该标记映射到该操作的路由。

我还注意到 html5 中的大多数视频都以 206 Partial Content 响应状态(例如http://video-js.zencoder.com/oceans-clip.mp4)提供,我认为这是流式传输视频所必需的。

任何帮助将不胜感激,我已经坚持了几天了。

提前致谢!

贡萨洛

4

1 回答 1

2

前段时间我有非常相似的任务:How to send Windows Azure Storage blob to browser with changed header and I done with ... java.net.URL,因为我在正确处理超时、未找到等方面遇到问题。

现在它运行良好,但我没有大文件,大约 30 - 200 mb。

虽然我不确定这种方法是否会让你满意,但你可以检查一下,也可以发送一些回复......也许我也会纠正我的观点:)

public static Result movie(String path) {
    try {
        URL url = new URL(path);
        response().setHeader("Content-Disposition", "inline");
        response().setHeader(CONTENT_TRANSFER_ENCODING, "binary");
        return ok(url.openStream()).as("video/mp4");
    } catch (IOException ex) {
        warn("Path " + path + " is not working...");
        return badRequest("Movie server didn't answer");
    }
}

很抱歉没有根据您的情况纠正片段,只需复制粘贴......我认为您会毫无问题地理解这个想法

于 2013-03-15T22:18:38.813 回答