HTML 5 Audio/Video DOM canplaythrough 事件在移动端遇到的坑

canplaythrough 事件定义和用法

当浏览器预计能够在不停下来进行缓冲的情况下持续播放指定的音频/视频时,会发生 canplaythrough 事件。

当音频/视频处于加载过程中时,会依次发生以下事件:

浏览器支持

所有主流浏览器都支持 canplaythrough 事件。

注释:Internet Explorer 8 或更早的浏览器不支持该事件。

以上是w3cschool的解释,但是在我实验检测中,发现chrome,firefox对此事件是支持的,而移动端对此事件支持需要辅助方法。

我们在做移动端h5的时候,可能都会需要预加载资源,包含图片,音视频文件

var audio = new Audio();
audio.addEventListener("canplaythrough",function(){
    console.log("加载完成!");
},false);
audio.addEventListener("error",function(){
    console.log("加载失败!");
},false);
audio.src = src;

看这段代码好像每错,在pc端检测也没有错,但是当我们放到h5上面就会出错,因为手机上面音乐是流媒体加载的,就是说在加载的过程中是可以播放的一边加载一边播放,canplaythrough 事件在移动端,只有允许audio/video文件加载播放完之后才会执行。

var audio = new Audio();
//canplaythrough这个事件在手机上流媒体要一边播放才能监听得到,pc端chrome可以完美支持
audio.addEventListener("canplaythrough",function(){
    //我们发现播放完之后这里执行了
    console.log("加载完成!");
},false);
audio.addEventListener("error",function(){
    console.log("加载失败!");
},false);
audio.src = src;
audio.play();

但是这里会导致加载的时候就播放声音,那于是这样干

var audio = new Audio();
//canplaythrough这个事件在手机上流媒体要一边播放才能监听得到,pc端chrome可以完美支持
audio.addEventListener("canplaythrough",function(){
    audio.pause();
    audio.volume = 1;
    //我们发现播放完之后这里执行了
    console.log("加载完成!");
},false);
audio.addEventListener("error",function(){
    console.log("加载失败!");
},false);
audio.src = src;
audio.play();
audio.volume = 0;

但是发现,效果不好,会出现停顿等现象。

于是最后想了一种方法,通过xmlHTTP来获取音频文件:

function createXHR(){
  try { return new XMLHttpRequest(); } catch (e) {}
  try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) {}
  try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e) {}
  try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
  try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
  return null;
}  

var xhr=createXHR();
xhr.onreadystatechange=function(){
    if(xhr.readyState == 4){
        if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
            callNext();
        }else{
            callNext();
        }
    }
};
scr = "song.mp3";
//true(异步)或 false(同步)
xhr.open("post",src,false);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send()

但是发现这样做还是不完美,发现音乐还是有延迟的现象;

欢迎大神拍砖,给出解决办法

时间: 2024-08-24 07:19:29

HTML 5 Audio/Video DOM canplaythrough 事件在移动端遇到的坑的相关文章

【转载】HTML5 Audio/Video 标签,属性,方法,事件汇总

<audio> 标签属性: src:音乐的URL preload:预加载 autoplay:自动播放 loop:循环播放 controls:浏览器自带的控制条 Html代码 <audio id=”media” src=”http://www.abc.com/test.mp3″ controls></audio> <video> 标签属性: src:视频的URL poster:视频封面,没有播放时显示的图片 preload:预加载 autoplay:自动播放

HTML5 Audio/Video 标签,属性,方法,事件汇总 (转)

HTML5 Audio/Video 标签,属性,方法,事件 <audio> 标签属性:src:音乐的URLpreload:预加载autoplay:自动播放loop:循环播放controls:浏览器自带的控制条 <audio id="media" src="http://www.abc.com/test.mp3" controls></audio> <video> 标签属性; src:视频的URL; poster:视频封

HTML5 Audio/Video 标签,属性,方法,事件汇总

HTML5 Audio/Video 标签,属性,方法,事件汇总 (转) 2011-06-28 13:16:48 <audio> 标签属性:src:音乐的URLpreload:预加载autoplay:自动播放loop:循环播放controls:浏览器自带的控制条 1 <audioid="media"src="http://www.abc.com/test.mp3"controls></audio> <video> 标签属

[转帖]HTML5 Audio/Video 标签,属性,方法,事件汇总

HTML5 Audio/Video 标签,属性,方法,事件汇总 <audio>标签属性: src:音乐的URL preload:预加载 autoplay:自动播放 loop:循环播放 controls:浏览器自带的控制条 Html代码   1.   <audio id="media" src="http://www.abc.com/test.mp3" controls></audio> <video>标签属性: src

html5 audio/video 的那些坑

当我最近项目用到audio的时候,我们用到了jPlayer作为三方库. 功能实现了,暂停播放,进度条什么的,都很顺利的搞定了.后来考虑到当网速过慢时需要给播放按钮一个载入动画,然后就一发不可收拾了. 找到jPlayer官方文档,看了下events事件,嗯不错,事件很全,几乎能解决任何需求: 从图中可以看出,我们肯定会用到waiting和playing事件来解决刚才提出的问题. 啪啪啪搞定: jq('#jPlayer').on($.jPlayer.event.waiting, function()

H5 Video + DOM

HTML 5 Video + DOM HTML5 视频 HTML5 音频 HTML5 <video> - 使用 DOM 进行控制 HTML5 <video> 元素同样拥有方法.属性和事件. 其中的方法用于播放.暂停以及加载等.其中的属性(比如时长.音量等)可以被读取或设置.其中的 DOM 事件能够通知您,比方说,<video> 元素开始播放.已暂停,已停止,等等. 下例中简单的方法,向我们演示了如何使用 <video> 元素,读取并设置属性,以及如何调用方法

整理之DOM事件阶段、冒泡与捕获、事件委托、ie事件和dom模型事件、鼠标事件

整理之DOM事件阶段 本文主要解决的问题: 事件流 DOM事件流的三个阶段 先理解流的概念 在现今的JavaScript中随处可见.比如说React中的单向数据流,Node中的流,又或是今天本文所讲的DOM事件流.都是流的一种生动体现.用术语说流是对输入输出设备的抽象.以程序的角度说,流是具有方向的数据. 事件流分事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张纸上的一组同心圆,如果你把手指放在圆心上,那么你的手指指向的其

HTML 5 Audio Video中怎样来插入音频和视频?

在HTML5 中新增了,两个标签来插入音频和视频.示例代码: 还可以通过一些参数来对媒体文件进行高级控制:以为例: controls,如果为标签添加controls属性, 播放器 就会向用户显示控制控件.对于音频文件来说,如果没有controls属性,用户将无法在页面上看到音频控件.autoplay顾名思义,就是自动播放,添加上这个属性后,一旦音频/视频准备就绪,就会开始自动播放. loop,用来控制是否循环播放.其实看教程会容易明白,你可以看下 <Buid New World>里面第七集叫:

[jPlayer] HTML5 Audio &amp; Video for jQuery

----------------------------------------------------------------------------------------------------- The jQuery HTML5 Audio / Video Library jPlayer is the completely free and open source (MIT) media library written in JavaScript. A jQueryplugin, (an