我在Chrome中遇到了一个奇怪的问题。
每次加载<video>
元素时,chrome都会启动两个HTTP请求。
第一个将永远保持待定(我猜这是“元数据”,“部分内容”请求。但关键是它保持待定状态)
第二个到同一个文件是正常的,并在加载结束后继续和关闭。
这里的问题是第一个请求保持挂起状态,直到我关闭浏览器页面。因此,在某些时候,如果我加载多个视频,Chrome会中断并停止下载任何内容,因为这些待处理的请求都会占用每个可用的请求。
我在这里创建了一个简化的测试用例:http://jsbin.com/ixifiq/3
我已检查以重现此问题,并且Video.js和MediaElements.js前台都会发生这种情况。加载页面时打开网络选项卡,您将看到第一个待处理的请求。然后按视频上的播放,您将看到第二个请求正常工作,但第一个请求将永久保留。
有谁知道修复此错误?
答案 0 :(得分:21)
(此错误仍存在于Chrome 38.0.2125.111,OS X 10.10中)
这可能是Chrome错误&amp;您可以在没有任何虚拟?time-suffix
技巧的情况下解决它,只需帮助Chrome更快地释放套接字:
我在RevealJs HTML演示文稿上有同样的错误,有20多个视频(每张幻灯片一个,在幻灯片焦点上自动播放)。作为一个副作用,这个未发布的套接字问题也会影响其他ajax-lazy-loaded媒体,紧跟在同一个HTML DOM中的第一个待处理/阻止视频之后。
根据Walter的回答(见bug report),我在接下来的步骤中解决了问题:
1-将视频preload
属性设置为none
:
<video preload="none">
<source src="video.webM" type="video/webM">
</video>
2 - 使用canplaythrough
事件处理程序在视频加载后播放和/或暂停视频。准备。这有助于Chrome释放用于加载该视频的套接字:
function loadVideos(){
$("video").each(function(index){
$(this).get(0).load();
$(this).get(0).addEventListener("canplaythrough", function(){
this.play();
this.pause();
});
});
}
答案 1 :(得分:14)
显然这是Chrome的一个错误。它与ATM无关。
我刚刚在Chromium项目上报告了这个问题并且已经分配了。所以希望它能在不久的将来得到解决。
错误报告:https://code.google.com/p/chromium/issues/detail?id=234779
答案 2 :(得分:9)
我不知道它现在是否可以正常运行,但我记得通过在视频网址中添加一个参数来解决这个问题,就像“video.mp4?t = 2123”一样。当然,每次加载视频时,参数都应该不同。我用
var parameter = new Date().getMilliseconds();
获取它,然后添加它。
有了这个,至少在几个月前,我能够多次播放同一个视频,而Chrome则无法永远等待响应。
希望它有所帮助。
答案 3 :(得分:8)
此错误仍然存在。我在单页应用程序上使用HTML5视频播放器。在加载了大约7名预缓冲的玩家之后,我达到了极限,没有更多的视频加载。我找到了另一个与图像有关的答案,我惊讶地发现这个答案解决了这个问题。
if(window.stop !== undefined) {
window.stop();
} else if(document.execCommand !== undefined) {
document.execCommand("Stop", false);
}
答案 4 :(得分:6)
我在动态内容(如轮播)中使用html5视频时发现此问题,以释放您必须卸载视频源的已阻止的套接字:
var video = $('#video');
video[0].pause();
video.prop('src','');
video.find('source').remove();
video.remove();
该错误声称已修复,但我仍然必须在Chrome 42上执行此操作。至少我仍然可以设置preload =“auto”。
答案 5 :(得分:1)
我们有相同的症状,但问题是我们连续两次在同一视频上调用load()
:相同的视频控制,相同的视频源(MP4)。两个完全相同的206请求出现在开发工具中,然后,在切换视频几次后,Chrome将取消第一个请求,关闭渐进式播放,并等待第二个请求完成。
另请注意,如果您正在使用MP4源并且它没有格式化以进行渐进式播放(意味着MOOV原子位于文件的开头),那么您将有1-2个额外的请求对于该文件,这使它更加令人困惑。
答案 6 :(得分:0)
@sidonaldson 的答案是唯一对我有用的答案。但是我没有删除视频或来源。以下代码对我有用,在放置正确的 src 并播放之前运行它。
W/System.err: com.parse.ParseRequest$ParseRequestException: schema mismatch for Tweet.Amitabh; expected Array but got String
W/System.err: at com.parse.ParseRequest.newPermanentException(ParseRequest.java:268)
at com.parse.ParseRESTCommand.onResponseAsync(ParseRESTCommand.java:302)
at com.parse.ParseRequest$3.then(ParseRequest.java:134)
W/System.err: at com.parse.ParseRequest$3.then(ParseRequest.java:130)
at com.parse.boltsinternal.Task$15.run(Task.java:907)
at com.parse.boltsinternal.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:113)
W/System.err: at com.parse.boltsinternal.Task.completeAfterTask(Task.java:898)
at com.parse.boltsinternal.Task.continueWithTask(Task.java:713)
at com.parse.boltsinternal.Task.continueWithTask(Task.java:724)
W/System.err: at com.parse.boltsinternal.Task$13.then(Task.java:816)
at com.parse.boltsinternal.Task$13.then(Task.java:804)
W/System.err: at com.parse.boltsinternal.Task$15.run(Task.java:907)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
@ecropolis 的回答也有效,但我的 SPA 最终会没有图像,所以它不是一个选项。