<audio> id&#61;"media" src&#61;"http://www.abc.com/test.mp3" controls>audio>
src&#xff1a;音乐的URL &#xff08;source标签在src属性不存在时使用&#xff09;
preload&#xff1a;预加载&#xff08;none、metadata、auto。如果不使用此属性&#xff0c;默认为auto。&#xff09;
autoplay&#xff1a;自动播放
loop&#xff1a;循环播放
controls&#xff1a;浏览器自带的控制条
<video>id&#61;"media" src&#61;"http://www.abc.com/test.mp4" controls width&#61;"400px" height&#61;"400px">
src&#xff1a;视频的URL
poster&#xff1a;视频封面&#xff0c;没有播放时显示的图片
preload&#xff1a;预加载
autoplay&#xff1a;自动播放
loop&#xff1a;循环播放
controls&#xff1a;浏览器自带的控制条
width&#xff1a;视频宽度
height&#xff1a;视频高度
muted:是否输出视频的声音
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | eventTester &#61; function (e){ Media.addEventListener(e, function (){ console.log((newDate()).getTime(),e); }); } eventTester( "loadstart" ); //客户端开始请求数据 eventTester( "progress" ); //客户端正在请求数据 eventTester( "suspend" ); //延迟下载 eventTester( "abort" ); //客户端主动终止下载&#xff08;不是因为错误引起&#xff09; eventTester( "error" ); //请求数据时遇到错误 eventTester( "stalled" ); //网速失速 eventTester( "play" ); //play()和autoplay开始播放时触发 eventTester( "pause" ); //pause()触发 eventTester( "loadedmetadata" ); //成功获取资源长度 eventTester( "loadeddata" ); // eventTester( "waiting" ); //等待数据&#xff0c;并非错误 eventTester( "playing" ); //开始回放 eventTester( "canplay" ); //可以播放&#xff0c;但中途可能因为加载而暂停 eventTester( "canplaythrough" ); //可以播放&#xff0c;歌曲全部加载完毕 eventTester( "seeking" ); //寻找中 eventTester( "seeked" ); //寻找完毕 eventTester( "timeupdate" ); //播放时间改变 eventTester( "ended" ); //播放结束 eventTester( "ratechange" ); //播放速率改变 eventTester( "durationchange" ); //资源长度改变 eventTester( "volumechange" ); //音量改变 |
事件详细说明&#xff1a;
1 2 3 4 | < audio controls> < source src &#61; "myAudio.ogg" type &#61; "audio/ogg" > < source src &#61; "myAudio.mp3" type &#61; "audio/mp3" >
audio > |
1 2 3 4 | < video controls> < source src &#61; "myVideo.mp4" type &#61; "video/mp4" > < source src &#61; "myVideo.webm" type &#61; "video/webm" >
video > |
再来张截图示意&#xff1a;&#xff08;http://en.wikipedia.org/wiki/Html_video_tag&#xff09;
Chrome浏览器支持HTML5&#xff0c;它支持原生播放部分的MP4格式&#xff08;不用通过Flash等插件&#xff09;。
为 什么是部分MP4呢&#xff1f;MP4有非常复杂的含义&#xff08;见http://en.wikipedia.org/wiki/Mp4&#xff09;&#xff0c;普通人对MP4的理解是后缀 为.mp4的文件。但MP4本身不是一种简单的视频格式&#xff0c;它是一个包装了视频和音频格式的壳。至于里面的视频和音频使用什么编码格式是可变的。MP4的视频格式可以使用DivX也可使用H264&#xff0c;Chrome只支持H264。
然后&#xff0c;我猜测问题的原因是这样的&#xff1a;Chrome浏览器见到MP4后缀的文件&#xff0c;使用了原生HTML5视频播放起播放&#xff0c;但却发现视频格式无法解码。对于Firefox&#xff0c;它不支持原生播放MP4&#xff0c;于是使用了Flash&#xff0c;绝大部分的视频格式基本都可通过Flash播放。
这 篇2011年1月的消息提到Google将放弃对H264的支持&#xff1a;http://www.infoq.com/cn/news/2011/01 /chrome-h264。这篇是Google方面的描述&#xff1a;http://blog.chromium.org/2011/01/html-video- codec-support-in-chrome.html。如果Google不再支持在Chrome上原生播放MP4&#xff0c;那么会调用Flash播放器播 放&#xff0c;这样反而不会出现有些MP4文件播放不了的问题。
为什么Chrome不支持所有的视频编码格式&#xff1f;绝大部份的视频编码格式都是要付版权费的&#xff0c;Google已经为H264买了单&#xff0c;Firefox没有Google那么有钱不愿意买。
最后&#xff0c;我录制了一段教学视频&#xff0c;指导大家怎样把各种视频转换成兼容性比较好的MP4文件。视频中使用的软件是“格式工厂”&#xff08;http://www.formatoz.com/CN/index.html&#xff09;&#xff0c;这个软件基本上只是做了一个界面&#xff0c;其核心调用了开源软件FFMPEG。由于它违反了FFMPEG的LGPL许可协议&#xff0c;备受指责。使用Linux的朋友可以直接使用FFMPEG命令进行视频格式转换&#xff0c;命令如下&#xff1a;
ffmpeg -i infile.flv -vcodec libx264 o5.mp4
如果转换出的视频在某些设备还是无法播放&#xff0c;可以试试利用MediaCoder转换兼容性更好的MP4
即使对浏览器来说&#xff0c;已经设置了正确的媒体&#xff0c;但有可能是您的服务器并不能正确识别多媒体的MIME类型。MIME类型告诉服务器如何处理不同的文件类型。如果你使用Apache&#xff0c;则可以在.htaccess文件中添加下面的音频支持&#xff1a;
AddType audio/ogg ogg AddType audio/ogg oga AddType audio/wav wav AddType mp3 AddType audio/mp4 mp4 AddType audio/mp4 mpa
类似地添加如下代码&#xff0c;以支持视频&#xff1a;
AddType video/webm webm AddType video/mp4 mp4 AddType video/ogg ogg AddType video/ogg ogv
如果不能访问服务器的.htaccess文件&#xff0c;则有可能在服务器的控制面板地方有一个选项&#xff0c;允许查看和添加MIME类型。
如果是Windows服务器&#xff0c;那么可能需要在IIS或者web.config中进行设置在web.config文件中 。
API本身是容易使用的 &#xff0c;但目前浏览器支持相当有限。Opera是目前唯一个实现这些功能的浏览器&#xff0c;但只支持视频Internet Explorer 10也将对其进行部分支持,Firefox也会跟随。
1 2 3 4 5 6 7 8 | var ifr&#61;document.createElement_x( "iframe" ); ifr.setAttribute( &#39;src&#39; , "song.mp3" ); ifr.setAttribute( &#39;width&#39; , &#39;1px&#39; ); ifr.setAttribute( &#39;height&#39; , &#39;1px&#39; ); ifr.setAttribute( &#39;scrolling&#39; , &#39;no&#39; ); ifr.style.border&#61; "0px" ; document.body.appendChild(ifr); |
HTML
id&#61;"player" width&#61;"480" height&#61;"320" webkit-playsinline>
Obj-C
webview.allowsInlineMediaPlayback &#61; YES;
在网上看到有人用JS写的播放器&#xff0c;木有仔细看&#xff0c;先贴过来。感觉让我自己写想不到这么周全&#xff0c;等后面要用再仔细寻更好方案。
原文地址&#xff1a;http://www.cnblogs.com/arby/archive/2012/04/07/2436352.html
function Audio(song, playType, dom){if(!dom) {this.media &#61; document.createElement_x(&#39;audio&#39;);document.body.appendChild(this.media);}else {this.media &#61; typeof dom &#61;&#61; &#39;string&#39; ? document.getElementByIdx_x(dom) : dom;}this.currentIndex &#61; 0;this.songList &#61; song;this.countTotal &#61; this.songList.length;this.playType &#61; playType || 1;this.MusicInfo &#61; [];this.playing &#61; false;
}
Audio.prototype.startPlay &#61; function(){this.media.src &#61; this.songList[this.currentIndex].src;this._play();
}Audio.prototype._play &#61; function(){var self &#61; this;this.media.play();this.playing &#61; true;this.mediaEvent(&#39;ended&#39; ,callback);function callback(){//单曲循环无需单独处理,只需直接调用startPlay()函数。if(self.media.currentTime &#61;&#61; self.media.duration){switch(self.playType){case 1:if(self.currentIndex &#61;&#61; self.countTotal-1){return false;}else{self.currentIndex&#43;&#43;;}break;case 2:self.currentIndex &#61; Math.floor(Math.random()*self.countTotal);break;case 4:self.currentIndex&#43;&#43;;console.log("self.currentIndex&#61;&#61;",self.currentIndex);self.currentIndex &#61; (self.currentIndex > self.countTotal-1) ? 0 : self.currentIndex;break;}self.startPlay();}}
}
Audio.prototype.playNext &#61; function(){this.currentIndex&#43;&#43;;this.currentIndex &#61; this.currentIndex > this.countTotal-1 ? 0 : this.currentIndex;this.startPlay();
}
Audio.prototype.playPrevious &#61; function(){this.currentIndex&#43;&#43;;this.currentIndex &#61; this.currentIndex <0 ? this.countTotal-1 : this.currentIndex;this.startPlay();}Audio.prototype.playPause &#61; function(callback){if(this.playing){this.media.pause();this.playing &#61; false;}else{this.media.play();this.playing &#61; true;}if(!callbakc){callback();}
}Audio.prototype.getCurrentTime &#61; function(){return this.media.currentTime;
}Audio.prototype.mediaEvent &#61; function(eventType, callback){Event.add(this.media,eventType,callback);
}Audio.prototype.playUserTime &#61; function(time){this.media.currentTime &#61; time;
}
Audio.prototype.getMusicInfo &#61; function(){this.MusicInfo.src &#61; this.media.currentSrc;this.MusicInfo.size &#61; this.media.duration;this.MusicInfo.name &#61; this.songList[this.currentIndex].name;return this.MusicInfo;
}
Audio.prototype.setVolume &#61; function(volumes){if(volumes) {this.media.volume &#61; volumes;}else{return this.media.volume;}
}
Audio.prototype.muted &#61; function(flag){if(flag){this.media.muted &#61; 1;}else{this.media.muted &#61; 0;}
}Audio.prototype.addSongToList &#61; function(song){this.songList.push(song);this.countTotal &#61; this.songList.length;}Audio.prototype.getBuffered &#61; function(){return this.media.buffered;
}
var Event &#61; {add : function(node, eventType, callback){var node &#61; typeof node &#61;&#61; &#39;string&#39; ? document.getElementByIdx_x(node) : node;if(document.addEventListener){node.addEventListener(eventType, callback, false);}else{node.attachEvent(&#39;on&#39; &#43; eventType, callback);}},remove : function(node, eventType, callback){var node &#61; typeof node &#61;&#61; &#39;string&#39; ? document.getElementByIdx_x(node) : node;if(document.removeEventListener){node.removeEventListener(eventType, callback, false);}else{node.detachEvent(&#39;on&#39; &#43; eventType, callback);}}
}var core &#61; {formatPlayTime : function(tempTime){var temp &#61; tempTime.toString().split(".")[0];if(tempTime<&#61;60){temp &#61; temp>&#61;10? temp : "0"&#43;temp;return "00 : " &#43; temp;}else{var minute &#61;Math.floor(temp/60);minute &#61; (minute >&#61; 10)? minute : "0"&#43; minute;var second &#61; temp&#96;;second &#61; (second >&#61; 10)? second : "0"&#43;second;return minute &#43; " : " &#43; second;}}
}