HTML5视频:强制中止缓冲

Bra*_*ger 49 video html5

如何在HTML5视频上强制中止事件?我有一个叠加层,当我关闭它时,视频应暂停播放然后停止缓冲.但是,我的互联网连接仍然疯狂.哦,我在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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

<video id="video_el" src="<video_url>" preload="none" controls="controls" />
Run Code Online (Sandbox Code Playgroud)

同样,这些都不起作用.以前有人遇到过这个问题吗?有什么建议?

总之,我试图强制HTML5视频元素停止缓冲.

谢谢!

Rub*_*ben 51

好的,所以在过去的几天里,我一直在努力解决这个问题.
这是我的分析和解决方案:

简而言之,我试图解决的问题是:
我注意到HTML5播放器在播放器暂停时不会停止下载(根本不是在合理的时间之后).使用24/7音频流并开发移动网站我意识到,如果他们离开网站时考虑到高数据使用率,这对我的访问者来说远非最佳 - 尽管我认为我会让一些电信公司非常高兴"俯瞰"这个问题......
为了澄清,我并不真正关心具有固定长度的文件.下载整个文件大多数时候是查看在线资源所需的功能(想想慢速连接),所以不是我试图阻止的东西.

分析:
HTML5音频元素没有stop()函数,也没有可以设置允许缓冲的数据量的选项,或者说你希望元素停止缓冲的方式 - Don不要将此与'preload'功能混淆,这仅适用于单击播放按钮之前的元素.
我不知道为什么会这样,为什么这个功能不可用.如果有人能够向我解释为什么这些关键功能没有在一个标准中实现,该标准应该使移动电话的web开发更好,更标准化,我很想知道.

解决方案:
我发现在音频元素中实现(某种)停止功能的唯一可行解决方案如下:
1.暂停当前播放器 - 您可以通过audio.addEventListener('pause'挂钩播放器上的暂停事件, yourFunction中);
2.将源设置为空 - audio.src ="";
3.加载src - audio.load();
4.删除整个音频元素
5.插入一个没有定义源的新HTML5音频元素
6.设置源(首先在那里的源) - audio.src ="old source url
7.重新挂起暂停事件 - audio.addEventListener('pause',current-function);

iOS必须完全注入新的HTML5音频播放器.只需重置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);
Run Code Online (Sandbox Code Playgroud)

按暂停将导致访问者丢失音频/视频文件中的当前位置,然后它将重新开始.我没有解决这个问题的方法.再说一次,如果你正在处理一个直播流,这个解决方案应该没问题.

希望这可以帮助.

  • 为什么不将当前时间存储在临时变量上,当用户点击播放按钮时,您将音频播放器设置为该值? (5认同)
  • 你确实可以这样做,但我开发了这个以卸载直播.在你按下停止点的时候拿起一个实时流是有点无意义的;)但对于非常大的文件,这绝对是一个非常好的点,我可以添加. (2认同)
  • @ArturBodera你的确是对的.try catch不起作用.我将把about:blank添加到原始帖子中.我快速浏览了一下,错误只发生在FF而不是Chrome中.据我所知,两种浏览器都"接受"不同的方法.如果您只是重新加载(使用相同的资源),FF很高兴.这将停止浏览器下载资源.Chrome不介意空资源.没有测试过其他浏览器,但我会添加这些注释.谢谢你的评论. (2认同)

Eri*_*roy 8

使用preload ="none",这是我在暂停视频后强制中止缓冲的方式,然后使用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>
Run Code Online (Sandbox Code Playgroud)