为什么手机内置浏览器无法播放非静态资源的视频?

注:该问题已找到问题根源,见下文“更新”

我现在有一个测试页面,以两种方式播放同一段视频,DOM结构如下:

<video id="video1" autoplay controls>
    <source src="http://192.168.9.89:8080/test/video.do" type="video/mp4" />
</video>
<video id="video2" autoplay controls>
    <source src="videos/temp.mp4" type="video/mp4" />
</video>

video1是通过java后台来获取视频源, 而video2直接就是静态资源,这是二者的区别。 其中video1中URL对应的 java 处理逻辑为:

javaFile videoFile = new File("/path/to/temp.mp4");

response.setContentType("video/mp4");// set the MIME type.
//response.addHeader ... 一些其他的设置

ServletOutputStream os = null;
BufferedOutputStream out = null;
RandomAccessFile raf = null;
byte b[] = new byte[1024];// 暂存容器
try {
    os = response.getOutputStream();
    out = new BufferedOutputStream(os);
    raf = new RandomAccessFile(videoFile, "r");
    raf.seek(pos);
    try {
        int n = 0;
        while ((n = raf.read(b, 0, 1024)) != -1) {
            out.write(b, 0, n);
        }
        out.flush();
    } catch (IOException ie) {

    }
} catch (Exception e) {

}

现在的情况是,在PC端浏览器 & 手机Chrome浏览器中,两段视频都可以正常播放。但是在手机自带浏览器中,通过 java 处理的video1无法播放(一直处于加载状态)。请问这是由什么问题导致?


更新:
经测试,是由于手机自带浏览器不支持HTTP的range属性,导致无法播放视频。但是,在java代码用的raf.seek(pos);其中pos0(即从文件起始处开发遍历)也同样无效。


更新:
经再次测试,并不是因为上面手机自带浏览器不支持HTTP的range属性导致。而是因为手机浏览器在分段请求视频源的时候,只在第一段的请求头中包含了cookie信息, 而我的后台代码中需要获取请求头中的cookie来进行权限验证。从而导致,在第一段之后的所有请求都无法通过校验,从而导致视频无法播放。

阅读 7.2k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题