注:该问题已找到问题根源,见下文“更新”
我现在有一个测试页面,以两种方式播放同一段视频,DOM结构如下:
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
来进行权限验证。从而导致,在第一段之后的所有请求都无法通过校验,从而导致视频无法播放。
小伙看你根骨奇佳,潜力无限,来学PHP伐。