<audio> 標籤屬性javascript
<audio id="media" src="http://www.abc.com/test.mp3" controls></audio> html
src:音樂的URL (source標籤在src屬性不存在時使用)
preload:預加載(none、metadata、auto。若是不使用此屬性,默認爲auto。)
autoplay:自動播放
loop:循環播放
controls:瀏覽器自帶的控制條
<video> 標籤屬性html5
<video id="media" src="http://www.abc.com/test.mp4" controls width="400px" height="400px"> </video> java
src:視頻的URL
poster:視頻封面,沒有播放時顯示的圖片
preload:預加載
autoplay:自動播放
loop:循環播放
controls:瀏覽器自帶的控制條
width:視頻寬度
height:視頻高度
muted:是否輸出視頻的聲音
獲取HTMLVideoElement和HTMLAudioElement對象node
//audio能夠直接經過new建立對象 git
Media = new Audio("http://www.abc.com/test.mp3"); github
//audio和video均可以經過標籤獲取對象 web
Media = document.getElementById("media"); chrome
Media方法和屬性——HTMLVideoElement 和 HTMLAudioElement 均繼承自 HTMLMediaElementapi
//錯誤狀態
Media.error; //null:正常
Media.error.code; //1.用戶終止 2.網絡錯誤 3.解碼錯誤 4.URL無效
//網絡狀態
Media.currentSrc; //返回當前資源的URL
Media.src = value; //返回或設置當前資源的URL
Media.canPlayType(type); //是否能播放某種格式的資源
Media.networkState; //0.此元素未初始化 1.正常但沒有使用網絡 2.正在下載數據 3.沒有找到資源
Media.load(); //從新加載src指定的資源
Media.buffered; //返回已緩衝區域,TimeRanges
Media.preload; //none:不預載 metadata:預載資源信息 auto:
//準備狀態
Media.readyState; //1:HAVE_NOTHING 2:HAVE_METADATA 3.HAVE_CURRENT_DATA 4.HAVE_FUTURE_DATA 5.HAVE_ENOUGH_DATA
Media.seeking; //是否正在seeking
//回放狀態
Media.currentTime = value; //當前播放的位置,賦值可改變位置
Media.startTime; //通常爲0,若是爲流媒體或者不從0開始的資源,則不爲0
Media.duration; //當前資源長度 流返回無限
Media.paused; //是否暫停
Media.defaultPlaybackRate = value;//默認的回放速度,能夠設置
Media.playbackRate = value;//當前播放速度,設置後立刻改變
Media.played; //返回已經播放的區域,TimeRanges,關於此對象見下文
Media.seekable; //返回能夠seek的區域 TimeRanges
Media.ended; //是否結束
Media.autoPlay; //是否自動播放
Media.loop; //是否循環播放
Media.play(); //播放
Media.pause(); //暫停//控制
Media.controls;//是否有默認控制條
Media.volume = value; //音量
Media.muted = value; //靜音
//TimeRanges(區域)對象
TimeRanges.length; //區域段數
TimeRanges.start(index) //第index段區域的開始位置
TimeRanges.end(index) //第index段區域的結束位置
eventTester = function(e){ Media.addEventListener(e,function(){ console.log((newDate()).getTime(),e); }); } eventTester("loadstart"); //客戶端開始請求數據 eventTester("progress"); //客戶端正在請求數據 eventTester("suspend"); //延遲下載 eventTester("abort"); //客戶端主動終止下載(不是由於錯誤引發) eventTester("error"); //請求數據時遇到錯誤 eventTester("stalled"); //網速失速 eventTester("play"); //play()和autoplay開始播放時觸發 eventTester("pause"); //pause()觸發 eventTester("loadedmetadata"); //成功獲取資源長度 eventTester("loadeddata"); // eventTester("waiting"); //等待數據,並不是錯誤 eventTester("playing"); //開始回放 eventTester("canplay"); //能夠播放,但中途可能由於加載而暫停 eventTester("canplaythrough"); //能夠播放,歌曲所有加載完畢 eventTester("seeking"); //尋找中 eventTester("seeked"); //尋找完畢 eventTester("timeupdate"); //播放時間改變 eventTester("ended"); //播放結束 eventTester("ratechange"); //播放速率改變 eventTester("durationchange"); //資源長度改變 eventTester("volumechange"); //音量改變
事件詳細說明:
Audio
Firefox:支持 Ogg Vorbis和WAV
Opera :支持Ogg Vorbis和WAV
Safari :支持MP3,AAC格式 ,和MP4
Chrome :支持Ogg Vorbis,MP3,WAV,AAC和MP4
Internet Explorer 9+ :支持MP3,AAC格式 ,和MP4
IOS :支持MP3,AAC格式 ,和MP4
Android :支持AAC和MP3
爲了最大程度支持全部上面提到的瀏覽器,建議開發者使用Ogg Vorbis和MP3這兩種格式例如。
<audio controls>
<source src="myAudio.ogg" type="audio/ogg"> <source src="myAudio.mp3" type="audio/mp3"> </audio>
Video
Firefox :支持Ogg Theora格式和WEBM
Opera :支持Ogg Theora格式和WEBM
Safari :支持MP4
Chrome :支持Ogg Theora格式,MP4和WEBM
Internet Explorer 9 :支持MP4和WEBM(須要安裝插件)
IOS :支持MP4
Android :支持MP4和WEBM(Android 2.3版本以上)
爲了支持上述全部的瀏覽器,建議使用WebM和MP4視頻文件做爲source元素。例如。
<video controls>
<source src="myVideo.mp4" type="video/mp4"> <source src="myVideo.webm" type="video/webm"> </video>
再來張截圖示意:(http://en.wikipedia.org/wiki/Html_video_tag)
Chrome瀏覽器支持HTML5,它支持原生播放部分的MP4格式(不用經過Flash等插件)。
爲何是部分MP4呢?MP4有很是複雜的含義(見http://en.wikipedia.org/wiki/Mp4),普通人對MP4的理解是後綴爲.mp4的文件。但MP4自己不是一種簡單的視頻格式,它是一個包裝了視頻和音頻格式的殼。至於裏面的視頻和音頻使用什麼編碼格式是可變的。MP4的視頻格式可使用DivX也可以使用H264,Chrome只支持H264。
而後,我猜想問題的緣由是這樣的:Chrome瀏覽器見到MP4後綴的文件,使用了原生HTML5視頻播放起播放,但卻發現視頻格式沒法解碼。對於Firefox,它不支持原生播放MP4,因而使用了Flash,絕大部分的視頻格式基本均可經過Flash播放。
這篇2011年1月的消息提到Google將放棄對H264的支持:http://www.infoq.com/cn/news/2011/01/chrome-h264。這篇是Google方面的描述:http://blog.chromium.org/2011/01/html-video-codec-support-in-chrome.html。若是Google再也不支持在Chrome上原生播放MP4,那麼會調用Flash播放器播放,這樣反而不會出現有些MP4文件播放不了的問題。
爲何Chrome不支持全部的視頻編碼格式?絕大部份的視頻編碼格式都是要付版權費的,Google已經爲H264買了單,Firefox沒有Google那麼有錢不肯意買。
最後,我錄製了一段教學視頻,指導你們怎樣把各類視頻轉換成兼容性比較好的MP4文件。視頻中使用的軟件是「格式工廠」(http://www.formatoz.com/CN/index.html),這個軟件基本上只是作了一個界面,其核心調用了開源軟件FFMPEG。因爲它違反了FFMPEG的LGPL許可協議,備受指責。使用Linux的朋友能夠直接使用FFMPEG命令進行視頻格式轉換,命令以下:
ffmpeg -i infile.flv -vcodec libx264 o5.mp4
若是轉換出的視頻在某些設備仍是沒法播放,能夠試試利用MediaCoder轉換兼容性更好的MP4
即便對瀏覽器來講,已經設置了正確的媒體,但有多是您的服務器並不能正確識別多媒體的MIME類型。MIME類型告訴服務器如何處理不一樣的文件類型。若是你使用Apache,則能夠在.htaccess文件中添加下面的音頻支持:
AddType audio/ogg ogg AddType audio/ogg oga AddType audio/wav wav AddType audio/mpeg mp3 AddType audio/mp4 mp4 AddType audio/mp4 mpa
相似地添加以下代碼,以支持視頻:
AddType video/webm webm AddType video/mp4 mp4 AddType video/ogg ogg AddType video/ogg ogv
若是不能訪問服務器的.htaccess文件,則有可能在服務器的控制面板地方有一個選項,容許查看和添加MIME類型。
若是是Windows服務器,那麼可能須要在IIS或者web.config中進行設置在web.config文件中 。
一種很常見的狀況是,用戶從客戶端提交給服務端一個類型的媒體文件,而且儘管你已經從它的文件擴展名中確認了其MIME類型。可是,該文件沒有被正確解碼。例如,它能夠是一個徹底有效的MP4文件,但因爲某種緣由,在一些瀏覽器中沒法播放。若是發生這種狀況,最好把用戶上傳的文件進行編碼,好比使用如Miro Video Coverter和Media Converter等編碼器,能夠確保正確的編碼。
此外,一些文件,尤爲是MP4文件,在測試時,不要老是在一個支持其格式的瀏覽器中進行測試,這是由於事實上,MP4存在不一樣的編碼格式,能夠根據不一樣格式對MP4(又稱如H.264)進行編碼(參考:http://en.wikipedia.org/wiki/H.264#Profiles)若是有的瀏覽器不支持其中的編碼格式,那麼它天然不會工做。若是遇到這種狀況,嘗試確保該文件是以最基本的MP4編碼方式進行編碼。最好建議使用工具,好比Miro轉換工具,它能確保MP4文件能在最多的瀏覽器中獲得支持。
若是須要支持Firefox 3.6和更低的版本,還須要轉換對應的音頻文件爲Ogg格式},並將它們添加到中的元素中。
通常狀況下,HTML5的的音頻和視頻播放器將容許用戶在完整下載文件前,就能夠開始進行播放了,有時候,對於MP4文件來講卻不能這樣,要必須等待全部的視頻下載完畢再播放,這主要是編碼問題形成的
有時,MP4文件使用索引進行了編碼(其中包含了好比文件長度等信息),每每這些信息是放在文件的尾部而不是頭部。索引信息中,包含了文件的元信息,瀏覽器根據這些元信息去進行下載。若是索引放在後面的話,則必須等待到得到整個文件的索引後,才能知道文件的元信息,因此就必須等到整個文件下載完畢才能開始播放了。
若是您遇到這種狀況,還有一個簡單的修補程序,是由埃裏克森Renaun提供的,下載地址爲:http://renaun.com/blog/code/qtindexswapper/,下載到計算機上運行,則能夠把文件的索引信息移動到文件頭並保存。
這個問題看上去好像有點多餘,但每次在Stack Overflow中,都會看到不少開發者發問,好比爲何某個方法不能運行,緣由在於他們使用了不存在的屬性。好比,在
<audio>和<video>標籤中都有的舊的屬性autobuffer,在2010年10月已經被preload取代了。
人們彷佛忘記了,HTML5是還沒有敲定的標準(雖然它的大部份內容如今已經都至關穩定),因此做爲開發者,必須多到W3C的官方網站去進行查閱相關資料。
最近相信很多開發者會發現音量控制的操做在Firefox 11及以上的版本中被取消了。是的,靜音和音量控制仍然是可使用的,但要經過鍵盤上的上和向下鍵進行控制,其緣由主要是發現了兩個bug(請參考:http://www.iandevlin.com/blog/2012/04/html5/html5-media-controls-and-firefox),這一點請開發者注意,估計firefox會很快修復這個問題。
HTML5的音頻和視頻點的最大賣點之一就是不須要安裝第三方插件-例如Flash
不幸的是,這不徹底正確,ie 9及以上版本的瀏覽器和Safari是須要使用Microsoft Media Player和Apple的QuickTime,才能播放HTML5音頻和視頻。
HTML5 視頻的其中一大威力在於其全屏播放的特性但HTML5 規範中,對這個竟然沒有任何說起,相反,在另一個關於全屏幕播放的API中有定義,但仍是在草稿階段,在一些瀏覽器中開始有試驗性的支持。
如下瀏覽器去一些支持全屏API,但具體使用的api方法各自有不一樣:
Chrome 19 版本以上
Firefox的12 +
Safari瀏覽器5.1 +
注:iPhone上,video自動全屏播放!
也有一些其餘方法,能在其餘瀏覽器中支持使用全屏API,好比https://github.com/sindresorhus/screenfull.js
Internet Explorer9 以上版本忽略了video poster屬性
若是在HTML 5的video標籤中使用poster屬性,其含義爲在視頻播放前提供一張靜態的圖片給用戶,但ie 9以上的版本,除非設置了preload屬性爲none,不然將會忽略掉設置的poster屬性。
這是因爲Internet Explorer是最遲支持HTML 5的瀏覽器,咱們都習慣了其餘瀏覽器中,若是設置了poster屬性,則會在播放視頻前,先顯示設置的這張圖片。但IE 9並不這樣作,若是要播放的視頻的第一幀已經加載了,則不會顯示有poster屬性指定的圖片了,並且在IE 10中,目前依然存在這個問題。
HTML 5的起草者們,一直都但願HTML 5能訪問攝像頭和麥克風,所以早期是使用標籤的,但如今是被getUserMedia API所取代了(詳見: http://dev.w3.org/2011/webrtc/editor/getusermedia.html)。
API自己是容易使用的 ,但目前瀏覽器支持至關有限。Opera是目前惟一個實現這些功能的瀏覽器,但只支持視頻Internet Explorer 10也將對其進行部分支持,Firefox也會跟隨。
經過iframe
var ifr=document.createElement("iframe"); ifr.setAttribute('src', "song.mp3"); ifr.setAttribute('width', '1px'); ifr.setAttribute('height', '1px'); ifr.setAttribute('scrolling', 'no'); ifr.style.border="0px"; document.body.appendChild(ifr);
經過頁面上的其餘觸摸或者點擊事件來調用對應的play()方法
HTML
<video id="player" width="480" height="320" webkit-playsinline>
Obj-C
webview.allowsInlineMediaPlayback = YES;
在網上看到有人用JS寫的播放器,木有仔細看,先貼過來。感受讓我本身寫想不到這麼周全,等後面要用再仔細尋更好方案。
原文地址:http://www.cnblogs.com/arby/archive/2012/04/07/2436352.html
function Audio(song, playType, dom){ /* * 播放器構造函數。 * dom:爲audio元素,能夠不傳。 * song : 爲歌曲列表,只支持數組形式,格式爲[{}{}] * playType 爲播放方式: 1 順序播放 2 隨機播放 3 單曲循環 4 所有循環 */ if(!dom) { this.media = document.createElement('audio'); document.body.appendChild(this.media); }else { this.media = typeof dom == 'string' ? document.getElementById(dom) : dom; } this.currentIndex = 0; this.songList = song; this.countTotal = this.songList.length; this.playType = playType || 1; this.MusicInfo = []; this.playing = false; } /* * 播放器啓動主函數 */ Audio.prototype.startPlay = function(){ this.media.src = this.songList[this.currentIndex].src; this._play(); } /* * 播放器播放核心函數. */ Audio.prototype._play = function(){ var self = this; this.media.play(); this.playing = true; this.mediaEvent('ended' ,callback); function callback(){ //單曲循環無需單獨處理,只需直接調用startPlay()函數。 if(self.media.currentTime == self.media.duration){ switch(self.playType){ case 1: if(self.currentIndex == self.countTotal-1){ return false; }else{ self.currentIndex++; } break; case 2: self.currentIndex = Math.floor(Math.random()*self.countTotal); break; case 4: self.currentIndex++; console.log("self.currentIndex==",self.currentIndex); self.currentIndex = (self.currentIndex > self.countTotal-1) ? 0 : self.currentIndex; break; } self.startPlay(); } } } /* *播放下一首若是當前已是最後一首則播放第一首 */ Audio.prototype.playNext = function(){ this.currentIndex++; this.currentIndex = this.currentIndex > this.countTotal-1 ? 0 : this.currentIndex; this.startPlay(); } /* *播放上一首若是當前已是第一首則播放最後一首 */ Audio.prototype.playPrevious = function(){ this.currentIndex++; this.currentIndex = this.currentIndex < 0 ? this.countTotal-1 : this.currentIndex; this.startPlay(); } /* * 暫停當前播放,若是傳回調函數,則暫停後執行回調。 */ Audio.prototype.playPause = function(callback){ if(this.playing){ this.media.pause(); this.playing = false; }else{ this.media.play(); this.playing = true; } if(!callbakc){callback();} } /* * 獲取當前播放位置 */ Audio.prototype.getCurrentTime = function(){ return this.media.currentTime; } /* * 播放器各類事件監聽. * tip 類型必須是正確的類型 */ Audio.prototype.mediaEvent = function(eventType, callback){ Event.add(this.media,eventType,callback); } /* * 播放用戶自定義時間,即拖動進度條。 */ Audio.prototype.playUserTime = function(time){ this.media.currentTime = time; } /* * 獲取當前媒體信息 * src 當前媒體路徑 * size 當前媒體總時長. */ Audio.prototype.getMusicInfo = function(){ this.MusicInfo.src = this.media.currentSrc; this.MusicInfo.size = this.media.duration; this.MusicInfo.name = this.songList[this.currentIndex].name; return this.MusicInfo; } /* * 設置或者獲取當前音量 * voluems的值需大於0 小於等於 1 */ Audio.prototype.setVolume = function(volumes){ if(volumes) { this.media.volume = volumes; }else{ return this.media.volume; } } /* * 設置或者取消靜音. * flag的值爲true是靜音,false時正常 */ Audio.prototype.muted = function(flag){ if(flag){ this.media.muted = 1; }else{ this.media.muted = 0; } } /* * 向播放列表添加新歌曲 * song爲所須要添加的歌曲,能夠多首,格式如構造函數中song. */ Audio.prototype.addSongToList = function(song){ this.songList.push(song); this.countTotal = this.songList.length; } Audio.prototype.getBuffered =