登錄 / 注冊

video的簡單操作及在IOS和Android下的差異

0評論 2017-05-05 14:13:13

收藏 | 點(diǎn)贊

  

這次小編與大家分享一下,如何對video做一些簡單基本的操作,包括了播放器的播放、暫停,音量的讀取、設(shè)置的相關(guān)操作。

一、獲取影片總時(shí)長

  對video操作進(jìn)行操作之前,應(yīng)先給video標(biāo)簽加個(gè)id,便于我們獲取video元素,這樣我們就可以開啟對video的探索之旅。首先要得到的是影片的一些信息,其中一個(gè)就是總時(shí)長。 

獲取video視頻總時(shí)長,要用到video的一個(gè)事件loadedmetadata,這個(gè)事件的觸發(fā)表示元數(shù)據(jù)(媒體的一些基本信息)已經(jīng)加載完成,用addEventListener監(jiān)聽事件

    var video = document.getElementById('video');//獲取video元素

    myVideo.addEventListener("loadedmetadata", function(){

      //要執(zhí)行的代碼

    });

這時(shí)已經(jīng)監(jiān)聽了,那么接下來要做的就是獲取總時(shí)長,其實(shí)就是用到了video的一個(gè)屬性:duration

    var video = document.getElementById('video');//獲取video元素

    video.addEventListener("loadedmetadata", function(){

       totalTime = video.duration;//獲取總時(shí)長

    });

需要注意的是獲取到的在總時(shí)長的單位為秒,顯示的時(shí)候可根據(jù)需要去轉(zhuǎn)換。 

二、播放、暫停

  我們經(jīng)常會(huì)需要對video設(shè)置播放或者暫停,播放或者暫停用到的video的兩個(gè)方法就是play和pause

         //播放

       function play(){

           video.play();

       }

 

       //暫停

       function pause(){

           video.pause();

       }

三、獲取影片的播放時(shí)間和設(shè)置播放點(diǎn)

  很多時(shí)候我們都想知道video視頻播到哪了,這需要監(jiān)聽一個(gè)事件和獲取一個(gè)屬性的值,用到的是video的timeupdate事件和currentTime屬性

    //更新播放時(shí)間點(diǎn)

   video.addEventListener("timeupdate", function(){

      var currentTime = video.currentTime; //獲取當(dāng)前播放時(shí)間

     console.log(currentTime); //在調(diào)試器中打印

 

     // 如果播放時(shí)間等于視頻總時(shí)間,就暫停播放

     if(currentTime == totalTime){

        pause();

     }

   });

設(shè)置播放點(diǎn),設(shè)置播放點(diǎn)用得還是currentTime屬性,currentTime屬性是可讀寫的,要注意的是設(shè)置值的單位是秒,如果播放點(diǎn)不是秒為單位那就要進(jìn)行轉(zhuǎn)換 

         //設(shè)置播放點(diǎn)

       function playBySeconds(num){

           video.currentTime = num;

       }

       playBySeconds(30); // 從30秒開始播放

四、音量的獲取和設(shè)置

   獲取音量可以直接用volume屬性,但是在這里還要介紹的是音量改變的觸發(fā)事件,方面以后需要自定義UI使用,那就是volumechange事件

     //改變音量

     video.addEventListener("volumechange", function(){

         var videoVolume = video.volume;//獲取當(dāng)前音量

         console.log(videoVolume);//在調(diào)試器中打印

     });

要注意的是音量的范圍值為0~1,一般在UI中都是用百分比,所以需要的時(shí)候要進(jìn)行轉(zhuǎn)換

音量是可以通過改變屬性來設(shè)置的,跟播放的時(shí)間點(diǎn)是相似的,只不過音量設(shè)置的是volume屬性。

//設(shè)置音量

     function setVol(num){

         video.volume = num;

     }

     setVol(0.5);

案例演示:

 

五、一些常用且需要重點(diǎn)關(guān)注的video事件

eventiOSAndroid
play只是要播放視頻,響應(yīng)的是video.play()方法,并不代表已經(jīng)開始播放和iOS一樣,僅是響應(yīng)video.play()方法
durationchange會(huì)執(zhí)行一次,一定會(huì)獲取到視頻的duration可能會(huì)執(zhí)行多次,只有最后一次才能獲取到真實(shí)的duration,前面的duration都是0;但低版本Android可能獲取到的duration是0或1;(本文提到的低版本Android大部分是4.1以下)
canplay可以認(rèn)為是視頻元素沒有問題,可以運(yùn)行,沒有更多含義了,基本用不上同iOS
canplaythrough會(huì)有明確的緩沖,表示可以流暢播放了;沒有什么用,視頻仍然會(huì)卡住,數(shù)據(jù)可能還沒有開始加載;
playing明確表示播放開始了;依然沒有用,視頻可能并沒有開始播放;
progress有明確的下載,可以獲取到當(dāng)前的buffer,并且全部下載完畢后不在觸發(fā);不一定有明確的數(shù)據(jù)下載,并且全部下載完畢后依然繼續(xù)觸發(fā);
timeupdate會(huì)有明確的進(jìn)度變化,可以獲取到currentTime;進(jìn)度不一定變化,currentTime可能總是0,但是第一次有currentTime變化的timeupdate事件一定代表了視頻開始播放了;
erroriOS中會(huì)有明確的錯(cuò)誤拋出;Android中某些瀏覽器會(huì)莫名其妙的拋出error;
stalled網(wǎng)絡(luò)狀況不佳,導(dǎo)致視頻下載中斷;在沒有play之前,也可能會(huì)拋出該事件。

 

六、屬性差異

attributesiOSandroid
poster
封面圖片
支持,但是加載速度明顯比在中要慢;不一定支持(瀏覽器廠商的實(shí)現(xiàn)標(biāo)準(zhǔn)不統(tǒng)一);
preload
預(yù)加載
iPhone不支持;可能支持;
autoplay
自動(dòng)播放
iPhone Safari中不支持,但在webview中可能被開啟;iOS開發(fā)文檔明確說明蜂窩網(wǎng)絡(luò)下不允許autoplay;可能支持;
loop
循環(huán)播放
支持可能支持;
controls
控制條
支持,但是需要開始播放了才顯示基本都支持顯示或者不顯示
width和height一定給出明確的屬性設(shè)置,且不能為0;如果不設(shè)置,僅僅通過CSS樣式去控制視頻大小,可能會(huì)導(dǎo)致標(biāo)簽失效。

 

七、其他怪異bug和不友好表現(xiàn)

iOSandroid
物理位置覆蓋在video區(qū)域上的元素,click和touch等事件會(huì)失效,比如一個(gè)a鏈接如果覆蓋在video上,那么點(diǎn)擊后沒有任何效果。-
iOS8.0+中,單頁面播放視頻超過16個(gè),再播放的視頻全部MediaError解碼異常無法播放。-
iPhone的Safari會(huì)彈出一個(gè)全屏的播放器來播放視頻,iPad則支持內(nèi)聯(lián)播放。iOS7+ 如果webview(比如微信)開啟了webview.allowsInlineMediaPlayback = YES;,可以通過設(shè)置webkit-playsinline屬性支持內(nèi)聯(lián)播放;支持內(nèi)聯(lián)播放,但某些廠商會(huì)用自己的播放器劫持原生的視頻播放;
下載視頻時(shí),會(huì)先發(fā)送一個(gè)2字節(jié)的請求來獲取視頻元數(shù)據(jù)(比如時(shí)長),然后再不斷的發(fā)送分包續(xù)傳(206)請求來下載視頻,抓包顯示請求數(shù)和請求量至少有一倍的冗余(x2),這個(gè)嚴(yán)重的bug在iOS8中有明顯的修復(fù),但是分包的206請求仍然會(huì)有冗余數(shù)據(jù)的下載,浪費(fèi)了流量。比iOS的處理方式好,沒有第一個(gè)2字節(jié)請求,沒有流量損耗;
-低版本Android(<=4.0.4)中,video如果在有相對和決定定位的層中,可能會(huì)導(dǎo)致整個(gè)頁面錯(cuò)位。
-某些瀏覽器廠商會(huì)劫持video,用其“自己”的播放器來播放視頻,“破壞”了產(chǎn)品本身的播放體驗(yàn),那么只能case by case的解決了。
加載視頻時(shí)沒有進(jìn)度提示,視覺上看不出是播放完了還是卡住了;加載視頻時(shí),大都會(huì)顯示一個(gè)自帶的loading UI。

  


0 條評論

分享
公眾號
公眾號二維碼

? 2017 志進(jìn)科技 版權(quán)所有 上海志進(jìn)信息科技有限公司 備案號滬ICP備14017051號-2