Safari中的HTML5视频无法正常工作

时间:2015-07-28 14:01:13

标签: java html5 video safari

在我们的 Java EE 应用程序中,我们使用HTML5 <video>标记播放 MP4 视频。 我们使用JBoss 7作为应用程序服务器。通过Struts2操作检索视频,如下所示:www.myproject.com/namespace/documents/3/zbRdTKQKLWnA2ZiY61Gx

其中zbRdTKQKLWnA2ZiY61Gx是服务器上的视频名称。

struts.xml:

...

<action name="documents/*/*" class="namespace.action.GestionDocumentAction" method="obtain">
    <param name="typeId">{1}</param>
    <param name="identifiantDocument">{2}</param>
    <result name="success" type="stream">
        <param name="contentType">video/mp4</param>
        <param name="inputName">flux</param>
        <param name="allowCaching">true</param>
        <param name="contentDisposition">inline;filename=${filename}</param>
    </result>
</action>

...

在Chrome和Firefox中很好,但在Mac上不在Safari中

在Safari中,当我打开包含<video>标记的页面时,&#34;正在加载&#34;显示但不加载视频。

这是非常奇怪的事情

如果直接在浏览器中将链接粘贴到视频 ,则会正确播放 。 然后,如果我使用所述视频重新加载页面,则播放精细

应用程序中的所有视频都会发生同样的事情。

发生了什么事?为什么视频最初没有播放?

Safari中的开发工具:

当我最初加载页面时,我得到以下结果: enter image description here

所有警告都是针对CSS。

我第一次在浏览器中打开文件enter image description here

错误是&#34;无法加载资源:由模块处理的加载&#34; : enter image description here

当我重新加载页面时,我得到相同的回复,但现在我可以播放视频了: enter image description here

我认为问题来自范围标题。 其实我用这个:

this.getServletResponse().setHeader("Accept-Ranges", "bytes");
this.getServletResponse().setHeader("Content-Type", "video/mp4");
this.getServletResponse().setHeader("Content-Length", "383631");      // 383631 - just for exemple, I use a real size
this.getServletResponse().setHeader("Content-Range", "bytes 0-383630/383631"); // 0-383630/383631 - the same
this.getServletResponse().setStatus(206);

1 个答案:

答案 0 :(得分:9)

Safari存在一个问题,即如果请求的视频资源没有明确地具有扩展名 .mp4 ,即使正确设置了mime类型也是如此。我可以复制你的问题 - 如果视频资源只是一个字符串标识符(没有.mp4),Safari会显示视频的预览,但它实际上不会播放。当资源重命名为filename.mp4时,Safari开始按预期播放视频。 Chrome无论哪种方式都运行良好。

如果您更改了namespace.action.GestionDocumentAction类,那么当第二个参数在.mp4结束时,它会剥离扩展名以找到正确命名的本地资源,它应该能够返回带有以Safari预期的结尾在.mp4中的网址 - www.myproject.com/namespace/documents/3/zbRdTKQKLWnA2ZiY61Gx.mp4