我的应用程序正在使用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 服务的操作的请求被多次发出。始终返回完整的视频长度(或在请求取消之前可以加载的内容)。
我还可以添加我从src
html5video
标记的属性调用操作,该标记映射到该操作的路由。
我还注意到 html5 中的大多数视频都以 206 Partial Content 响应状态(例如http://video-js.zencoder.com/oceans-clip.mp4)提供,我认为这是流式传输视频所必需的。
任何帮助将不胜感激,我已经坚持了几天了。
提前致谢!
贡萨洛