在我们的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>
标签的页面时,会显示“正在加载”,但不会加载视频。
这里出现了真正奇怪的事情。
如果直接在浏览器中粘贴视频链接,则可以正确播放。然后,如果我重新加载带有该视频的页面,它会正常播放。
应用程序中的所有视频都会发生同样的情况。
发生了什么?为什么视频一开始不能播放?
Safari中的开发工具:
所有警告都与CSS有关。
错误是“Failed to load resource: load handled by the module”:
当我重新加载页面时,我得到相同的响应,但现在我可以播放视频:
我认为问题出在范围头文件上。实际上,我使用的是这个:
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);