HTML5视频元素请求永远保持待定状态(在Chrome上)

时间:2013-04-21 23:39:52

标签: html5 google-chrome html5-video mediaelement.js video.js

我在Chrome中遇到了一个奇怪的问题。

每次加载<video>元素时,chrome都会启动两个HTTP请求。

第一个将永远保持待定(我猜这是“元数据”,“部分内容”请求。但关键是它保持待定状态)

第二个到同一个文件是正常的,并在加载结束后继续和关闭。

这里的问题是第一个请求保持挂起状态,直到我关闭浏览器页面。因此,在某些时候,如果我加载多个视频,Chrome会中断并停止下载任何内容,因为这些待处理的请求都会占用每个可用的请求。

我在这里创建了一个简化的测试用例:http://jsbin.com/ixifiq/3


我已检查以重现此问题,并且Video.jsMediaElements.js前台都会发生这种情况。加载页面时打开网络选项卡,您将看到第一个待处理的请求。然后按视频上的播放,您将看到第二个请求正常工作,但第一个请求将永久保留。

有谁知道修复此错误?

7 个答案:

答案 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);
}

参考:Javascript: Cancel/Stop Image Requests

答案 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 最终会没有图像,所以它不是一个选项。