我想通过后端的tapestry5(5.3.5)通过HTML5视频标签将视频流式传输到我的IPad.通常,服务器端框架甚至不应该在这方面发挥作用,但它确实如此.
无论如何,希望有人在这里可以帮助我.请记住,我的项目非常原型,我所描述的内容被简化/简化为相关部分.如果人们没有回答强制性的"你想做错事"或与问题无关的安全/表现挑剔,我将非常感激.
所以这里:
我有一个从Apple HTML5展示的视频,所以我知道格式不是问题.我有一个简单的tml页面"Play",它只包含一个"视频"标签.
我首先实现了一个RequestFilter,它通过打开引用的视频文件并将其传输到客户端来处理来自视频控件的请求.这是基本的"如果路径以'文件'开头,则将文件输入流复制到响应输出流".这适用于Chrome,但不适用于Ipad.好吧,但是,我必须是一些我不知道的标题,所以我再次看了Apple Showcase并包含相同的标题和内容类型,但没有快乐.
接下来,我会,好吧,让我们看看如果我让t5提供文件会发生什么.我将视频复制到webapp上下文,禁用了我的请求过滤器,并将简单文件名放在视频的src属性中.这适用于Chrome和iPad.这让我很吃惊,并促使我看看T5如何处理静态文件/上下文请求.到目前为止,我只是觉得有两种不同的路径,我通过将带有@Path("上下文:")的硬连线"视频src"切换到资产来确认.这同样适用于Chrome,但不适用于iPad.
所以我真的迷失在这里.什么是"简单上下文"中的秘密请求允许它在IPad上工作?没有什么特别的事情,但这是唯一的方法.问题是,我无法真正从我的webapp上下文中提供这些视频...
因此,事实证明,有一个名为"Range"的http标头,而且与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", …
Run Code Online (Sandbox Code Playgroud)