我想通过后端带有tapestry5(5.3.5)的HTML5视频标签将视频流式传输到我的iPad。通常服务器端框架甚至不应该在这方面发挥作用,但它不知道如何。视频流式传输到ipad不适用于Tapestry5
无论如何,希望这里有人能帮助我。请记住,我的项目是一个原型,我所描述的内容被简化/简化为相关部分。如果人们没有回应强制性的“你想做错事”或与问题无关的安全/性能问题,我将非常感激。
所以这里有云:
设置
我从苹果HTML5拍摄的视频展示,所以我知道该格式是不是一个问题。我有一个简单的tml页面“播放”,只包含一个“视频”标签。
问题
我开始通过实施处理通过打开引用的视频文件,并将其流媒体客户端从视频控制的请求RequestFilter。这是基本的“如果路径以'文件'开始,然后将文件输入流复制到响应输出流”。这对Chrome非常适用,但不适用于Ipad。好吧,我虽然,一定是我失踪的一些标题,所以我再次看着Apple Showcase,并包含相同的标题和内容类型,但没有喜悦。
接下来,我想,让我们看看如果我让t5服务文件会发生什么。我将视频复制到了webapp上下文,禁用了我的请求过滤器,并将简单文件名放在视频的src属性中。这适用于Chrome和iPad。 这让我感到惊讶,并促使我看看T5如何处理静态文件/上下文请求。到目前为止,我只是觉得有两种不同的方式,我已经通过使用@Path(“context:”)将硬连线“视频src”切换到资产来确认。这又一次适用于Chrome,但不适用于iPad。
所以我真的迷失在这里。在“简单的上下文”请求中,这个秘密果汁是什么使它能够在IPad上工作?没有什么特别的,但它是唯一的方法。问题是,我真的不能从我的web应用程序上下文服务于那些西元...
解决方案
所以,事实证明,有这个所谓的“范围” HTTP头和iPad的,不同于Chrome使用它与视频。那么“秘诀”就是静态资源请求的servlet处理程序知道如何处理范围请求,而T5则不知道。这是我的自定义实现:
OutputStream os = response.getOutputStream("video/mp4");
InputStream is = new BufferedInputStream(new FileInputStream(f));
try {
String range = request.getHeader("Range");
if(range != null && !range.equals("bytes=0-")) {
logger.info("Range response _______________________");
String[] ranges = range.split("=")[1].split("-");
int from = Integer.parseInt(ranges[0]);
int to = Integer.parseInt(ranges[1]);
int len = to - from + 1 ;
response.setStatus(206);
response.setHeader("Accept-Ranges", "bytes");
String responseRange = String.format("bytes %d-%d/%d", from, to, f.length());
logger.info("Content-Range:" + responseRange);
response.setHeader("Connection", "close");
response.setHeader("Content-Range", responseRange);
response.setDateHeader("Last-Modified", new Date().getTime());
response.setContentLength(len);
logger.info("length:" + len);
byte[] buf = new byte[4096];
is.skip(from);
while(len != 0) {
int read = is.read(buf, 0, len >= buf.length ? buf.length : len);
if(read != -1) {
os.write(buf, 0, read);
len -= read;
}
}
} else {
response.setStatus(200);
IOUtils.copy(is, os);
}
} finally {
os.close();
is.close();
}
这是有用的信息;没有理由为什么Tapestry无法在标准资产处理代码中自动处理;我们只是不知道它需要做什么。将这一级别的信息添加到我们的JIRA是第一步。 –
优秀的答案。马上就像魅力一样工作。非常感谢。 –