摘要:此文已由作者吳家聯(lián)授權(quán)網(wǎng)易云社區(qū)發(fā)布。歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)。播放器的設(shè)計(jì)思路重構(gòu)后應(yīng)該包含這些功能支持點(diǎn)播非加密的和直播播放兼容適配移動(dòng)端根據(jù)平臺(tái)自動(dòng)選擇使用還是。直播的一些特點(diǎn)直播狀態(tài)的判斷。
此文已由作者吳家聯(lián)授權(quán)網(wǎng)易云社區(qū)發(fā)布。
歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)。
去年年中的時(shí)候,借著產(chǎn)品改版的機(jī)會(huì),將之前的h5播放器好好整理重構(gòu)了一番。之前的h5播放器較為簡陋,有幾個(gè)大問題:沒有適配移動(dòng)端(最大的不足)、沒有提供直播模式、有一些歷史遺留的bug沒有修復(fù)。重構(gòu)版除了解決了這幾個(gè)大問題外,還做了很多的優(yōu)化。加上與flash播放器的結(jié)合和近期飛哥主導(dǎo)的教育產(chǎn)品組件標(biāo)準(zhǔn)化,播放器適用性變得更強(qiáng)更通用了。
h5播放器的設(shè)計(jì)思路?
重構(gòu)后應(yīng)該包含這些功能:支持點(diǎn)播(非加密的MP4)和直播播放(m3u8)、兼容(適配)移動(dòng)端、根據(jù)平臺(tái)自動(dòng)選擇(使用flash還是h5)。
框架和庫上,還是選擇主要使用nej框架,nej提供了很豐富的方法。對(duì)外暴露的類使用regular實(shí)現(xiàn),因?yàn)榻逃a(chǎn)品前端組件和業(yè)務(wù)工程大部分是使用regular的,在使用上會(huì)很方便。另外在移動(dòng)端上選用了flexible方案,因?yàn)榻逃a(chǎn)品的web頁適配已經(jīng)統(tǒng)一使用flexible了,手勢(shì)事件的處理選用了
為了方便擴(kuò)展和添加組件,使用了觀察者模式。觀察者模式在視頻播放器這樣規(guī)模的工程中使用非常合適,也是屢試不爽的一種設(shè)計(jì)模式。我直接參考了flex中類似的實(shí)現(xiàn),使用js寫了一遍(當(dāng)然自己寫也很快)。
![][1]
圖如上所示,component基類和componentContainer單例類實(shí)現(xiàn)了觀察者模式,所有組件都繼承自component類,component實(shí)例中可以調(diào)用方法發(fā)送notification對(duì)象進(jìn)行組件之間的通信,notification的調(diào)度則在componentContainer中實(shí)現(xiàn)了。這些組件分為必須組件和可選組件,必須組件包括:視頻對(duì)象組件(movieData)、視頻播放組件(mainVideo)、api組件等,可選組件則是根據(jù)不同產(chǎn)品的業(yè)務(wù)需求來開發(fā)的,可以通過不同組件列表的配置來自定義播放器的具體功能,這個(gè)也是在componentContainer實(shí)現(xiàn)。Html5VideoMedia則是對(duì)HTMLVideoElement的封裝,它不作為一個(gè)組件,只是提供視頻播放的功能,以及定義了相關(guān)的事件,使用Html5VideoMedia的除了視頻播放組件,還可以是片頭廣告組件。
適配方面,樣式上的適配使用了flexible的方案。有的組件比較復(fù)雜,比如控制條,在web端和移動(dòng)端功能差別很大,樣式差別也很大,可以考慮不同平臺(tái)使用不同組件(圖中可以看到control和controlMobile),邏輯上會(huì)很清晰,不用寫很多的if和else,不過因?yàn)檫@樣要依賴更多的組件,js和css文件會(huì)更大一些。個(gè)人覺得為了提高代碼的可維護(hù)性,犧牲部分的文件大小也是可取的。
hls直播的一些特點(diǎn)
直播狀態(tài)的判斷。其實(shí)直播功能跟業(yè)務(wù)的關(guān)聯(lián)是很大的,這里的直播狀態(tài)也是只業(yè)務(wù)中的狀態(tài),比如:未開始、即將開始、直播中、直播結(jié)束等等。我們產(chǎn)品中目前還是使用前端輪詢的方式更新直播的狀態(tài),有一點(diǎn)要提的是hls流是不會(huì)觸發(fā)end事件的,所以h5直播的狀態(tài)其實(shí)是完全靠輪詢來控制的。
如何判斷流異常。一般網(wǎng)絡(luò)問題或者是源問題的處理可以監(jiān)聽video標(biāo)簽和source標(biāo)簽的error事件,兩種標(biāo)簽都需要監(jiān)聽。但是error觸發(fā)時(shí)的錯(cuò)誤信息有時(shí)候并不信息,或者說不同瀏覽器實(shí)現(xiàn)上不一樣,之前有碰到過改變currentTime屬性來seek,偶爾會(huì)觸發(fā)error事件,但是error中只說了是網(wǎng)絡(luò)錯(cuò)誤,沒有任何其他信息,在對(duì)比了其他視頻后才確定是某個(gè)視頻轉(zhuǎn)碼的問題,確實(shí)十分的蛋疼。在直播流播放過程中,偶爾會(huì)出現(xiàn)流異常的情況,流異常一般會(huì)表現(xiàn)為畫面卡死,不一定觸發(fā)error事件。我參考了之前青果同事的方案:每隔一段時(shí)間檢查currentTime,如果在播放狀態(tài)下currentTime在這段時(shí)間內(nèi)未改變,很可能就是流異常了,則主動(dòng)重新加載。
3.一些目前無法解決的問題
ios上視頻相關(guān)的問題很多,因?yàn)橄到y(tǒng)的限制太多了。稍微列一下:
同時(shí)只能播放一個(gè)視頻或者音頻,只允許一個(gè)video或者audio標(biāo)簽。做片頭廣告功能會(huì)麻煩一點(diǎn)。
ios版本較低的Safari中播放視頻會(huì)強(qiáng)制全屏,ios 10中可以使用playsinline。在微信和一些定制的webkit中可以添加webkit-playsinline解決。
在沒有人為操作的情況下,無法實(shí)現(xiàn)進(jìn)入頁面自動(dòng)開始播放視頻
ios中無法使用js控制video音量,只能由物理按鍵控制。在ios中你可以直接隱藏音量控制功能了。。。
還有截屏的問題,不過產(chǎn)品中沒有使用到就暫時(shí)沒有調(diào)研。
android上的問題也很多,主要是因?yàn)閍ndroid版本太多、機(jī)型太多,各方面參差不齊。稍微列一下:
部分android系統(tǒng)會(huì)直接替換video標(biāo)簽,使用系統(tǒng)播放器播放,常見于國產(chǎn)手機(jī)
canPlayType方法檢測(cè)結(jié)果與實(shí)際不符,這個(gè)問題在開發(fā)過程中遇到過,例如在一部華碩手機(jī)上檢測(cè)到不支持m3u8播放,但是實(shí)際卻可以播放,原本想放開這個(gè)限制的,后來發(fā)現(xiàn)在云課堂app的webview中強(qiáng)制播放可能會(huì)導(dǎo)致app崩潰,所以最后還是加上了檢測(cè)。。
不支持m3u8播放的android一般是android4.0左右及以下的
網(wǎng)易云免費(fèi)體驗(yàn)館,0成本體驗(yàn)20+款云產(chǎn)品!
更多網(wǎng)易技術(shù)、產(chǎn)品、運(yùn)營經(jīng)驗(yàn)分享請(qǐng)點(diǎn)擊。
文章來源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25277.html
摘要:是一款輕量級(jí)易擴(kuò)展的播放器,是為解決一些中小型的視頻業(yè)務(wù)場(chǎng)景。同時(shí)各插件由于是面向的播放器接口,插件不知道插件的存在,因此能極大地降低各插件功能間的耦合。 larkplayer 是一款輕量級(jí) & 易擴(kuò)展的 html5 播放器,是為解決一些中小型的視頻業(yè)務(wù)場(chǎng)景。這些業(yè)務(wù)不一定需要大而全的解決方案,并且他們往往有自己的定制化需求。 背景 為什么要編寫 larkplayer?(注意,這里面有...
摘要:是一款輕量級(jí)易擴(kuò)展的播放器,是為解決一些中小型的視頻業(yè)務(wù)場(chǎng)景。同時(shí)各插件由于是面向的播放器接口,插件不知道插件的存在,因此能極大地降低各插件功能間的耦合。 larkplayer 是一款輕量級(jí) & 易擴(kuò)展的 html5 播放器,是為解決一些中小型的視頻業(yè)務(wù)場(chǎng)景。這些業(yè)務(wù)不一定需要大而全的解決方案,并且他們往往有自己的定制化需求。 背景 為什么要編寫 larkplayer?(注意,這里面有...
閱讀 1320·2021-09-22 15:09
閱讀 2655·2021-08-20 09:38
閱讀 2402·2021-08-03 14:03
閱讀 863·2019-08-30 15:55
閱讀 3368·2019-08-30 12:59
閱讀 3550·2019-08-26 13:48
閱讀 1885·2019-08-26 11:40
閱讀 647·2019-08-26 10:30