選擇ZEGO即構(gòu)科技可以輕松讓小程序、webrtc和app互通連麥直播,ZEGO即構(gòu)科技毫秒級音視頻互動(dòng),千萬級高并發(fā),70%丟包下仍能保障穩(wěn)定流暢的觀看體驗(yàn)。【點(diǎn)擊免費(fèi)試用,0成本啟動(dòng)】
寧安網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)建站2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
WebRTC是面向互聯(lián)網(wǎng)的一種即時(shí)通信標(biāo)準(zhǔn),由于被Chrome、火狐、Safari等主流瀏覽器支持,并提供了一致和簡潔的API,使得開發(fā)WebRTC的視頻通信應(yīng)用非常簡單和流行。在大多數(shù)情況下,我們認(rèn)為雙向視頻通信技術(shù)和視頻直播技術(shù)是兩種不同的技術(shù),一個(gè)做視頻通話,一個(gè)做單向直播(在以往的直播方案中,絕大部分是采用rtmp協(xié)議做直播上行的)。有沒有可能使用WebRTC進(jìn)行視頻直播呢?這樣既可以利用WebRTC的低延遲和良好的網(wǎng)絡(luò)適應(yīng)性,又可以充分利用WebRTC API的簡潔性獲得更高的開發(fā)效率和靈活性。
想要了解更多關(guān)于webrtc的相關(guān)信息,推薦咨詢ZEGO即構(gòu)科技。ZEGO即構(gòu)科技自主研發(fā)的高音質(zhì)語音視頻引擎,能夠提供實(shí)時(shí)清晰的多人語音視頻通話。支持多路視頻畫面,保障每一路語音視頻都清晰流暢提供端到端的SDK、分布式轉(zhuǎn)碼、接入鑒權(quán)云服務(wù)接入、擺脫運(yùn)維、輕松支撐海量用戶運(yùn)營。
注:亮度調(diào)節(jié)和音量調(diào)節(jié)gif無法體現(xiàn),功能是ok的,其次默認(rèn)Icon鎖的close和open實(shí)在難以分辨。
環(huán)境:Flutter 2.8.1 channel stable ;Dart 2.15.1
需要音頻播放器的看這里: Flutter音樂播放器
重點(diǎn)說下這個(gè)工具類,因?yàn)橐曨l播放,涉及到狀態(tài)改變有很多,筆者剛開始選擇使用 InheritedWidget 來在眾多的widget之間共享數(shù)據(jù)。但是總感覺這樣有點(diǎn)繁瑣,且不很優(yōu)雅!
這里非廣告,如果是使用 GetX 就很簡單了,筆者也使用了 GetX 進(jìn)行封裝了,一瀉千里的趕腳!,但是筆者還是那句話:剛開始接觸Flutter的開發(fā)者不是很建議使用 GetX ,可以先熟悉下Flutter狀態(tài)管理的基礎(chǔ)原理再行使用。而且為了盡量簡潔,還是不引入其他的第三方了。
我們選擇對第三方插件進(jìn)行封裝的目的不外乎這幾個(gè):
于是筆者就寫了一個(gè)工具類 VideoPlayerUtils ,專門且只用來處理播放器的所有業(yè)務(wù)。包括暫停、播放、跳轉(zhuǎn)、調(diào)節(jié)音量、調(diào)節(jié)亮度、切換視頻等操作。在所有的widget中不會(huì)引用關(guān)于 video_player 或其他第三方插件的任何信息, VideoPlayerUtils 負(fù)責(zé)widget與播放器之間的所有操作交互。后續(xù)優(yōu)化迭代或更換播放器插件時(shí),只需針對這個(gè)工具類進(jìn)行修改,對所有widget不會(huì)有任何的影響,大大的解耦合了。
其中 VideoPlayerState :
提供以上的公共屬性,可以通過 VideoPlayerUtils 來獲取對應(yīng)的值,使用 get 只讀,使外界不會(huì)誤修改這些屬性,以保證數(shù)值的安全性。開發(fā)者可根據(jù)自身需要自行添加屬性。
提供以上方法來處理播放器的所有業(yè)務(wù)。同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。
重點(diǎn)說下這個(gè)方法,是整個(gè)業(yè)務(wù)的核心方法,控制視頻的播放或暫停。開發(fā)者只要遇到播放或暫停是均可調(diào)用此方法,具體是播放或暫停,內(nèi)部根據(jù)傳入的 url 自行判斷,開發(fā)者不需要關(guān)心。
切換新視頻也是使用此方法,傳入的 url 與上次不一致,自動(dòng)切換新視頻。筆者可根據(jù) statusListener 來監(jiān)聽播放狀態(tài)的改變,以此處理自身邏輯。
這個(gè)也需要提下,視頻播放器在播放新視頻時(shí)會(huì)異步初始化,一般我們的操作是在 initState() 初始化,成功后再 setState() 。這里筆者遇到一個(gè)讓人蛋疼的問題:
我們看 video_player 的使用:
VideoPlayer(controller) :widget中已經(jīng)持有了controller。本來筆者封裝的目的就是為了讓widget與controller的之間解耦合。但此時(shí)的筆者。。。。
放棄不是不可能放棄的,這輩子都不會(huì)放棄的!
于是筆者取了巧,寫了一個(gè)初始化監(jiān)聽器 initializedListener ,包換2個(gè)參數(shù): bool,Widget ,初始化是否成功;其中widget為初始化成功返回需要展示的播放器UI,失敗默認(rèn)返回 const SizedBox() 。
到這里就可以簡單使用了:
沒看錯(cuò),視頻播放就是這么簡單。
如果有更多的業(yè)務(wù)功能,筆者也按照自己的需求寫了一套,同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。
VideoPlayerGestures 主要是處理手勢的,比如快進(jìn)、快退等跳轉(zhuǎn)播放;左側(cè)上下滑動(dòng)調(diào)節(jié)亮度;右側(cè)上下滑動(dòng)調(diào)節(jié)音量;單擊是否開啟沉浸式播放,所有widget的隱藏與顯示;雙擊播放、暫停等。
哦,還有 PercentageWidget 也放到這個(gè)文件下了,就是這玩意:
因?yàn)轱@示的百分比與手勢相關(guān),隨著手勢移動(dòng)而更新。開發(fā)者可自行處理。
筆者處出于簡單考慮,就按照整個(gè)UI的位置命名了。瞅一眼就知道是啥玩意。
同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。
就是這玩意:
同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。話說這個(gè)鎖的 Icon 的open和close是真的難分辨!
就是這玩意:
同樣的開發(fā)者可根據(jù)自身需要自行添加或修改。
這玩意是自定義的,別問,問就是跟產(chǎn)品干一架落了下風(fēng)
主要就是自定義這玩意:
同樣的開發(fā)者可根據(jù)自身需要自定義。
注:這里沒有添加緩沖的進(jìn)度,開發(fā)可查看 video_player 中的源碼 VideoProgressIndicator ,按業(yè)務(wù)自行定義。
這玩意就是整合以上的widget,再考慮下全屏的安全區(qū)域,沒啥東西。開發(fā)者可自行處理!
具體的實(shí)現(xiàn)監(jiān)聽器的思路, 看這里 。
自此一個(gè)漂亮的Flutter視頻播放器就已經(jīng)結(jié)束了。如果您覺得對您有些許幫助的話,歡迎 Star !
可以用web端來做視頻直播,不過你使用的是什么語言框架?自己如果技術(shù)不是很好的話,可以選擇接入第三方服務(wù)商的直播SDK的。我司接入的是 ZEGO即構(gòu)科技的低延遲直播SDK,java的,此外它還支持多種語言框架,包括React Native、JavaScript 、Swift、Electron、Flutter等。