HTML5video:强制中止缓冲

如何强制在HTML5video上放弃事件? 我有一个覆盖,当我closures它,video应暂停播放,然后停止缓冲 。 然而,我的互联网连接继续坚果。 哦,我在Mac OS X 10.6上使用Chrome 7.0.5。

我已经尝试了几件事 – 他们都没有工作:

(对于那些不熟悉XUI的人来说,x $就像jQuery的包装函数)

首先,调度一个中止的HTML事件:

var videoEl = x$('#video_el')[0]; videoEl.pause(); var evObj = document.createEvent('HTMLEvents'); evObj.initEvent('abort', false, false); videoEl.dispatchEvent(evObj); 

接下来,更改src然后强制加载:

 var videoEl = x$('#video_el')[0]; videoEl.pause(); videoEl.src = ""; videoEl.load(); //tried with and without this step 

编辑:我的video元素看起来像这样:

 <video id="video_el" src="<video_url>" preload="none" controls="controls" /> 

再次,这些都没有工作。 任何人都遇到过这个问题? 有什么build议么?

总之,我试图强制HTML5video元素停止缓冲。

谢谢!

好的,所以在过去的几天里,我一直在为这个问题而苦苦挣扎。
这是我的分析和解决scheme:

总之,我试图解决的问题:
我注意到,当播放器暂停时,HTML5播放器不会停止下载(完全不在合理的时间之后)。 使用24/7audiostream和开发移动网站,我意识到,这是远远优于我的访问者考虑到高数据使用率,如果他们离开网站开放 – 虽然我确实认为我会让一些电信公司非常高兴的“俯瞰“ 这个问题…
只是为了澄清,我真的不关心固定长度的文件。 下载整个文件大部分时间是查看在线资源所需的function(想想慢速连接),所以不是我试图阻止的事情。

分析:
HTML5audio元素没有stop()函数,也没有可以设置允许缓冲的数据量的选项,或者说要让元素停止缓冲的方法 – 不要将其与“预加载”function混淆,这仅适用于点击播放button之前的元素。
我不知道为什么这是为什么这个function不可用。 如果任何人都可以向我解释为什么这些关键的function没有实现在一个标准,应该使手机networking开发更好,更标准化,我很想知道。

解:
我发现在audio元素中实现(某种)停止function的唯一工作解决scheme如下:
1.暂停当前播放器 – 您可以通过audio.addEventListener('pause',yourFunction)挂钩播放器上的暂停事件。
2.将源设置为空 – audio.src =“”;
加载src – audio.load();
4.删除整个audio元素
5.插入一个没有定义源的新的HTML5audio元素
6.设置源(首先在那里的源) – audio.src =“旧的源URL
7.重新挂起暂停事件 – audio.addEventListener('pause',current-function);

iOS需要完全注入一个新的HTML5audio播放器。 简单地重置src,然后加载它会导致玩家在我的情况下“自动播放”…

对于懒惰的人(包括jQuery):

 var audio = $("audio").get(0); audio.pause(0); var tmp = audio.src; audio.src = ""; audio.load(); $("audio").remove(); $("#audio-player").html("<audio controls preload='none'></audio>");<br> audio = $("audio").get(0); audio.src = tmp; audio.addEventListener('pause', current-function); 

按暂停将导致您的访客失去了audio/video文件中的当前位置,它将重新开始。 我没有解决这个问题。 然后再一次,如果你正在处理直播,这个解决scheme应该没问题。

希望这可以帮助。

使用preload =“none”,这是我暂停video后强制中止缓冲,然后使用jQuery在暂停的位置重新开始播放。

 <video id="video_el" src="<video_url>" preload="none" controls="controls" /> <script> jQuery(function() { var video = jQuery('video').get(0); video.addEventListener('pause',function(){ var tmp_src = video.src; var playtime = video.currentTime; video.src = ''; video.load(); video.src = tmp_src; video.currentTime = playtime; }); }); </script> 

请参阅: http : //dev.w3.org/html5/spec/video.html#attr-media-preload

也许你可以把preload设置为none

如果不起作用:你可以获取它的属性,删除它,插入一个新的video元素,并给这个元素保存的属性?

其实你可以通过设置src属性作为一个PHP / ASPX文件与一些参数来读取文件内容和检索数据作为等效的types(例如, Content-Type: video/mp4 )做同样的事情。 但它不工作在IE 11(真是一个惊喜:D),那么你需要做的伎俩上面这个华丽的浏览器。

用这个…

 <video id="v1" preload="none"> <source src="video.php?id=24" type="video/mp4"> </video> 

而不是这个…

 <video id="v2" preload="none"> <source src="video-24.mp4" type="video/mp4"> </video> 

作为一个缺点,你将无法确定video的全部长度,但要解决这个问题,这并不是那么大,你可以将这个值存储在你的数据库中,或者再做一个小技巧。

我已经使用Chrome 32,Firefox 26,Opera 18和IE 11testing了以下脚本

 setInterval(function() { var r = []; try { r.push(v1.buffered.end(0)); } catch(e) { r.push('nahh'); }; try { r.push(v2.buffered.end(0)); } catch(e) { r.push('second nahh'); }; console.log(r.join(', ')); }, 500); 

在我的localhoststesting中…

Firefox 26按下play之后,它总是缓冲完整的文件。

IE 11(考虑到src="video-24.mp4" ,因为另一个不起作用)在你按下play后,它总是缓冲文件块,即使它被暂停,完全忽略preload="none"属性。

Chrome 32完美工作(Opera 18相同)。