audio和video元素

前面的話

  HTML5新增了兩個與媒體相關的標籤,讓開發人員沒必要依賴任何插件就能在網頁中嵌入跨瀏覽器的音頻和視頻內容,這兩個標籤是<audio>和<video>,且不被IE8-瀏覽器支持javascript

    以視頻文件舉例,它包含了音頻軌道、視頻軌道和其餘一些元數據(封面、標題、子標題、字幕等)html

HTML元素

  使用這兩個元素至少要在標籤中包含src屬性。位於開始和結束標籤之間的任何內容都將做爲後備內容,在瀏覽器不支持這兩個媒體元素的狀況下顯示java

 

<audio>

autoplay         自動播放
controls         顯示控件
loop             循環播放
preload          音頻在頁面加載時進行加載,並預備播放(若使用autoplay,則忽略該屬性)
src              要播放的音頻的URL        
<audio controls autoplay loop muted src="song.mp3"> <source src="song.mp3" type="audio/mp3" /> </audio> 

  <演示框>點擊下列相應屬性值可進行演示web

 

<video>

複製代碼
autoplay            自動播放
controls            顯示控件
height            播放器高度
width             播放器寬度
loop                循環播放
preload        視頻在頁面加載時進行加載,並預備播放(若使用autoplay,則忽略該屬性)
preload="none"//當頁面加載後不載入視頻 preload="auto"//當頁面加載後載入整個視頻 preload="meta"//當頁面加載後只載入元數據 src 要播放的視頻的URL poster     規定視頻下載時顯示的圖像,或者在用戶點擊播放按鈕前顯示的圖像 
複製代碼
<video id="test" src="movie.mp4" width="280" height="200" poster="diejia.jpg"></video>

  <演示框>點擊下列相應屬性值可進行演示chrome

 

<source>

  爲<video>和<audio>提供媒介資源瀏覽器

media     規定媒體資源的類型(沒有瀏覽器支持)
src      規定媒體文件的URL
type      規定媒體資源的MIME類型

  經常使用類型網絡

    視頻 [1]video/ogg [2]video/mp4 [3]video/webmapp

    音頻 [1]audio/ogg [2]audio/mpegide

 

  使用<audio>和<video>至少要在標籤中包含src屬性。位於開始和結束標籤之間的任何內容都將做爲後備內容,在瀏覽器不支持這兩個媒體元素的狀況下顯示函數

<video src="#"> video player not available. </video>
<audio src="#"> audio player not available. </audio>

  由於並不是全部瀏覽器都支持全部媒體格式,因此能夠指定多個不一樣的媒體來源。爲此,不用在標籤中指定src屬性,而是使用一個或多個<source>元素

複製代碼
<video>
    <source src="video.webm" type="video/webm; codecs='vp8,vorbis'"> <source src="video.ogg" type="video/ogg; codecs='theora,vorbis'"> <source src="video.mp4"> video player not available. </video>
複製代碼
<audio>
    <source src="audio.ogg" type="audio/ogg"> <source src="audio.mp3" type="audio/mp3"> audio player not available. </audio>

   由於並不是全部瀏覽器都支持<audio>和<video>標籤,因此更好的解決辦法是有備選內容

<audio controls="controls" height="100" width="100"> <source src="song.mp3" type="audio/mp3" /> <embed height="100" width="100" src="song.mp3" /> </audio>
複製代碼
<video width="320" height="240" controls="controls"> <source src="movie.mp4" type="video/mp4" /> <object data="movie.mp4" width="320" height="240"> <embed src="movie.mp4" width="320" height="240" /> </object> </video>
複製代碼

 

API

  HTML5 DOM爲<audio>和<video>元素提供了方法、屬性和事件

方法

(1)canPlayType()

  檢測瀏覽器是否能播放指定的音頻或視頻類型,返回值爲下列之一:

'probable':瀏覽器最可能支持該類型 'maybe':瀏覽器也許支持該類型 '':瀏覽器不支持該類型
複製代碼
//經常使用值 video/ogg video/mp4 video/webm audio/mpeg audio/ogg audio/mp4 video/ogg;codecs="theora,vorbis" video/mp4;codecs="avc1.4D401E,mp4a.40.2" video/webm;codecs="vp8.0,vorbis" audio/ogg;codecs="vorbis" audio/mp4;codecs="mp4a.40.5"
複製代碼
複製代碼
<audio id="audio" src="song.mp3"></audio> <script> var audio = document.getElementById('audio'); //probably console.log(audio.canPlayType('video/ogg;codecs="theora,vorbis"')); </script>
複製代碼

(2)load()

  從新加載音頻或視頻元素,用於在更改src來源或其餘設置後對音頻或視頻元素進行更新

複製代碼
<audio id="audio" src="song.mp3" autoplay controls></audio> <script> var audio = document.getElementById('audio'); audio.src = 'myocean.mp3'; audio.load(); </script>
複製代碼

(3)play()

  開始播放音頻或視頻

(4)pause()

  暫停當前播放的音頻或視頻

<button onclick = 'audio.play();'>播放</button> <button onclick = 'audio.pause();'>暫停</button> <audio id="audio" src="myocean.mp3" controls></audio> 

  <演示框>點擊下列相應屬性值可進行演示

 

屬性

  [注意]全部屬性中,只有videoWidth和videoHeight是當即可用的,在音視頻的元數據加載後,其餘屬性纔可用

<只讀>

(1)buffered

buffered.length//獲取已緩衝範圍的數量 buffered.start(index)//獲取某個已緩衝範圍的開始位置 buffered.end(index)//獲取某個已緩衝範圍的結束位置 buffered.end(0)//獲取當前已緩衝的秒數
複製代碼
<button>獲取緩衝時間</button>
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> var oBtn = document.getElementsByTagName('button')[0]; oBtn.onclick = function(){ alert(audio.buffered.end(0)); } </script> 
複製代碼

 (2)currentSrc

  返回當前音頻或視頻的URL

複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> var audio = document.getElementById('audio'); //http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3 setInterval(function(){ console.log(audio.currentSrc); },1000); </script> 
複製代碼

(3)ended

  返回音頻或視頻是否已結束

複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> document.onclick = function(){ console.log(audio.ended); } </script>
複製代碼

(4)duration

  返回當前音頻或視頻的長度(以秒計),若是未設置則返回NaN

複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio>
<script>
//NaN
console.log(audio.duration);
//317.022041
setTimeout(function(){
    console.log(audio.duration);
},1000);
複製代碼

(5)networkState

  返回音頻或視頻當前網絡狀態

networkState:0(還沒有初始化) networkState:1(已選取資源,但並未使用網絡) networkState:2(正在下載數據) networkState:3(未找到資源來源)
複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> //3 console.log(audio.networkState) //1 document.onclick = function(){ console.log(audio.networkState); } </script> 
複製代碼

(6)paused

  返回音頻或視頻是否已暫停

paused:true;(已暫停) paused:false;(未暫停) 
複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> console.log(audio.paused) document.onclick = function(){ console.log(audio.paused); } </script> 
複製代碼

(7)played

  已播範圍是指音頻或視頻的時間範圍。若是用戶在音頻或視頻中跳躍,會得到多個播放範圍

played.length(得到音頻或視頻已播放範圍的數量)
played.start(index)(得到某個已播範圍的開始位置)
played.end(index)(得到某個已播範圍的結束位置)

  [注意]首段已播範圍的下標是0

複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> document.onclick = function(){ console.log(audio.played.end(0)); } </script>
複製代碼

(8)readyState

  返回音頻或視頻的當前就緒狀態

readyState:0(沒有關於音頻或視頻是否就緒的信息) readyState:1(關於音頻或視頻就緒的元數據) readyState:2(關於當前播放位置的數據是可用的,但沒有足夠的數據來播放下一幀) readyState:3(當前及至少下一幀的數據是可用的) readyState:4(可用數據足以開始播放)
複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> //0 console.log(audio.readyState); //4 document.onclick = function(){ console.log(audio.readyState); } </script> 
複製代碼

(9)seekable

  返回可尋址範圍,可尋址範圍是指用戶在視頻或音頻中可尋址(移動播放位置)的時間範圍。對於流視頻,一般能夠尋址到視頻中的任何位置,即便其還沒有完成緩衝

seekable.length(得到音頻或視頻中可尋址範圍的數量)
seekable.start(index)(得到可尋址範圍的開始位置)
seekable.end(index)(得到可尋址範圍的結束位置)
複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> document.onclick = function(){ console.log(audio.seekable.end(0)); } </script>
複製代碼

(10)seeking

seeking:true(用戶正在尋址) seeking:false(用戶沒有在尋址)
複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> audio.onseeking = function(){ console.log(audio.seeking); } </script>
複製代碼

 

 <可讀寫>

(1)autoplay

autoplay:false(默認,不自動播放) autoplay:true(自動播放)

(2)controls

controls:false(默認,不顯示控件) controls:true(顯示控件)

(3)crossOrigin

  設置或返回CORS設置

(4)currentTime

  設置或返回音頻或視頻的當前位置(以秒計)

複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> var audio = document.getElementById('audio'); document.onclick = function(){ console.log(audio.currentTime); audio.currentTime = 5; console.log(audio.currentTime); }; </script>
複製代碼

(5)defaultMuted(只有chrome支持)

defaultMuted:true(初始靜音) defaultMuted:false(默認,初始不靜音)
audio.defaultMuted = true;

(6)muted

muted:true(靜音) muted:false(不靜音)
<button onclick="audio.muted = !audio.muted">音量開關</button> <audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio>

(7)defaultPlaybackRate

defaultPlaybackRate:1(正常速度) defaultPlaybackRate:0.5(半速) defaultPlaybackRate:2(倍速) defaultPlaybackRate:-1(向後正常速度) defaultPlaybackRate:-0.5(向後半速)
var audio = document.getElementById('audio'); setTimeout(function(){ audio.defaultPlaybackRate = 0.5; audio.load(); },1000);

(8)playbackRate

playbackRate:1(正常速度) playbackRate:0.5(半速) playbackRate:2(倍速) playbackRate:-1(向後正常速度) playbackRate:-0.5(向後半速)
複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> var array = [-1,-0.5,0.5,1,2]; var i = 0; var audio = document.getElementById('audio'); document.onclick = function(){ audio.playbackRate = array[i]; console.log(audio.playbackRate); i++; i=i%5; }
複製代碼

(9)loop

loop:true(循環播放) loop:false(默認,不循環播放)

(10)preload

  設置或返回是否在頁面加載後當即加載音頻或視頻

preload:auto;(一旦頁面加載,則開始加載音頻或視頻)
preload:metadata;(當頁面加載後僅加載音頻或視頻的元數據)
preload:none;(頁面加載後不加載音頻或視頻)

  [注意]當設置autoplay時,該屬性無效

(11)src

  設置或返回音頻或視頻的當前來源

複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> console.log(audio.src); document.onclick = function(){ console.log(audio.src); audio.src = 'http://7xpdkf.com1.z0.glb.clouddn.com/song.mp3'; audio.load(); console.log(audio.src); } </script>
複製代碼

(12)volume

  設置或返回音頻或視頻的當前音量

volume(取得爲0-1,0爲靜音,1爲最大,默認爲1)    
<button onclick = "if(audio.volume<=0.9)audio.volume+=0.1;">增大音量</button> <button onclick = "if(audio.volume>=0.1)audio.volume-=0.1;">減少音量</button> <audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio>

 

事件

  當音頻或視頻正在加載過程當中,會依次發生如下事件:

複製代碼
loadstart:提示瀏覽器開始尋找指定的音頻或視頻
progress:提示瀏覽器正在下載指定的音頻或視頻
durationchange:提示音頻或視頻的時長已改變
loadedmetadata:提示音頻或視頻的元數據已加載
loadeddata:提示音頻或視頻的當前幀已加載,但沒有足夠數據播放下一幀
canplay:提示瀏覽器可以開始播放指定的音頻或視頻
canplaythrough:提示音頻或視頻可以不停頓地一直播放
progress:提示瀏覽器正在下載指定的音頻或視頻
複製代碼
複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls></audio> <script> audio.onloadstart = function(){ console.log('loadstart'); } audio.ondurationchange = function(){ console.log('durationchange'); } audio.onloadedmetadata = function(){ console.log('loadedmetadata'); } audio.onloadeddata = function(){ console.log('loadeddata'); } audio.onprogress = function(){ console.log('progress'); } audio.oncanplay = function(){ console.log('canplay'); } audio.oncanplaythrough = function(){ console.log('canplaythrough'); } </script>
複製代碼

 

  影響音頻或視頻數據加載的事件有如下幾個:

abort:在音頻或視頻終止加載時觸發
error:在音頻或視頻加載發生錯誤時觸發
stalled:在瀏覽器嘗試獲取媒體數據,但數據不可用時觸發
suspend:在音頻或視頻數據被阻止加載時觸發(能夠是完成加載後觸發,或者由於被暫停)
empted:在發生故障而且文件忽然不可用時觸發
複製代碼
<video id="video" src="http://7xpdkf.com1.z0.glb.clouddn.com/movie.mp4" controls></video> <script> setTimeout(function(){ video.src=''; },2000); video.onabort = function(){ console.log('abort'); } video.onerror = function(){ console.log('error'); } video.onstalled = function(){ console.log('stalled'); } video.onsuspend = function(){ console.log('suspend'); } video.onemptied = function(){ console.log('emptied'); } </script>
複製代碼

  音頻或視頻控制按鈕發生改變時觸發如下事件:

複製代碼
play:音頻或視頻文件已經就緒能夠開始播放時觸發
playing:音頻或視頻已開始播放時觸發
ended:音頻或視頻文件播放完畢後觸發
pause:音頻或視頻文件暫停時觸發
ratechange:播放速度改變進觸發
seeked:指示定位已結束時觸發
seeking:正在進行指示定位時觸發
timeupdate:播放位置改變時觸發[注意:播放和調整指示定位時都會觸發]
volumechange:音量改變時觸發
waiting:須要緩衝下一幀而中止時觸發
複製代碼
複製代碼
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/honey.mp3" controls></audio> <script> var i = 1; document.onclick = function(){ i+=0.1; audio.playbackRate = i; } audio.onended = function(){ console.log('ended'); } audio.onpause = function(){ console.log('pause'); } audio.onplay = function(){ console.log('play'); } audio.onplaying = function(){ console.log('playing'); } audio.onratechange = function(){ console.log('ratechange'); } audio.onseeked = function(){ console.log('seeked'); } audio.onseeking = function(){ console.log('seeking'); } audio.ontimeupdate = function(){ console.log('timeupdate'); } audio.onvolumechange = function(){ console.log('volumechange'); } audio.onwaiting = function(){ console.log('waiting'); } </script>
複製代碼

 

audio專有

  <audio>元素在一個原生的javascript構造函數Audio,能夠在任什麼時候候播放音頻。Audio和Image很像,但Audio不用像Image那樣必須插入到文檔中,只要建立一個新實例,並傳入音頻源文件便可

var audio = new Audio('test.mp3'); 
複製代碼
<script>
var audio = new Audio('http://7xpdkf.com1.z0.glb.clouddn.com/honey.mp3'); audio.oncanplaythrough = function(){ audio.controls = true; document.body.appendChild(audio); } </script>
複製代碼
 
相關文章