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


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

我现在有一个测试页面,以两种方式播放同一段视频,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 处理逻辑为:


 java


 File 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); 其中 pos 0 (即从文件起始处开发遍历)也同样无效。


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

html5-video java web前端开发 html5 http

DR300 9 years, 3 months ago

Your Answer