移动端视频缓存保障与CDN调度优化
生活随笔
收集整理的這篇文章主要介紹了
移动端视频缓存保障与CDN调度优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文由網易云信資深音視頻客戶端工程師張根寧在LiveVideoStackCon 2019上海音視頻技術大會的演講整理而成,張根寧分享了團隊在線視頻播放器優化的主要方向,即緩沖和卡頓問題。對于卡頓,可以優化CDN轉發過程來解決緩存不足的問題,通過無縫切換保證流暢度。針對首屏秒開,可以通過合適的切流措施和多CDN的災備策略來保證拉流成功率,而優化的根本在于首屏流程中移除耗時操作。
文 / 張根寧整理 / LiveVideoStack
我是來自網易云信的張根寧,今天我將會站在用戶的角度來跟大家探討播放器的相關優化,也會詳細闡述網易云信團隊在播放器方面都做了哪些努力。
1.?移動端播放器優化實踐
1.1 播放器
從這個反向推,我覺得在播放器的播放過程當中給用戶最不好的體驗就是這兩點,一個是開始的頻繁緩沖,第二個是在播放的過程當中的卡頓。這兩點在播放器里會涉及到兩個關鍵的指標:卡頓率和秒開率。今天的內容主要是將如何針對這兩點來進行優化。??我們的播放器底層基于ijkplayer,跟大部分的播放器的底層架構一樣,有三個外部視頻輸入,(像網絡視頻)經過輸入之后會經過解協議,到下面解封裝,音視頻流分離進行解碼、同步、最后呈現。?關鍵點在兩塊緩存,第一個緩存是原始數據緩存,第二個解碼出來的數據緩存。今天的所有的優化會針對這兩個緩存進行。?把播放器從拿到流到播放流理解成一個工廠,有三種原因會導致流播不出來:?1.根本沒拿到,所謂的緩存不足,存貨不足。2.拿到了,但是性能有限處理不過來,只能頻繁丟幀。給用戶的感覺要么就是慢速播放,要么頻繁跳幀。3.時間戳是亂的。這種是比較極端的情況,可能是上行的推流端在錯誤的情況下或者在CDN轉發的時候出現了錯誤,這種卡頓只能及時檢測。?
1.2 為什么緩存里沒有數據了?
??其實從整個鏈路來看,無論是點播還是直播都是大概經過這三個方向:比如直播。上行會推個流到CDN。點播采用CDN回源去點播原站去拿視頻流,最終終端會從CDN的一個節點上拉取視頻流。?但在這三個節點上面每一個都有可能會發生卡頓:?第一,在推流端發出來的時候視頻流丟了。(針對于這種情況我們推流端做了很多工作,像QS實時偵測網絡帶寬、根據網絡帶寬調整分辨率以及碼率進行頻繁發送)?第二,在CDN轉發過程丟幀或者不及時。這種是主要優化對象。因為播放質量跟CDN是息息相關的,如果CDN不及時本地再怎么優化也于事無補。第三,本地帶寬不夠。當用戶在本地網絡不好的時候這是最常見的一種卡頓。從節點上看,在回來的時候(當前的解包能力和解析流的能力是不會占用太多的CPU和內存的)主要的性能瓶頸就是在解碼。與渲染相比,一些低端的IOS(像4,4S解一個1080P視頻)解碼器的性能不夠,它在30毫秒之內吐不出來一幀,所以在用戶看到的時候已經變成慢速播放。而有些幀可能在送到解碼器之前就已經丟掉了。或者渲染能力不行,解碼能力雖然跟上了,但無法在指定的時間內渲染出來圖像給用戶。?1.3?卡頓優化-CDN質量
我們服務端有調度服務器來控制CDN的選擇。?
第一步,感知卡頓。依賴一套完備的卡頓處理監控體系。在典型模型里面這三塊對應三塊緩沖區,會有數據流入和數據流出量,以及當前數據平緩度的統計。渲染會有丟幀率的統計,根據統計上報信息在服務端計算當前的網絡狀態以及數據情況,給出最優的當前卡頓率結果。就可以判斷當前的卡頓率范圍屬于正常還是異常。?
1.4?本地性能優化
1.5?點播卡頓
?
1.6?秒開
1.7 GSLB調度優化-預調度
引入模型:有一個隊列,用戶可以提前加入一批他拿到的URL地址,交給調度分為兩塊緩存來存,一塊是4G,一塊是WiFi。播放的時候會判斷緩存里有沒有。沒有,開始調度。有的話,直接緩存命中去播。這樣可以節省首屏的HTTP請求的時間。?在這個方向還會有兩個問題。第一,調度速度。第二,基于調度優先級。?因此在考慮并發性的情況下,允許最大的并發數量為4 - 6個。為了保證優先級遵循先進先出,先進先調的順序。而有即時的調度任務會優先調度,并且在避免帶寬搶占的情況下會把預調度里面的所有隊列里面的任務暫停,優先調度。?另外CDN調度,本身即時有效,比如說用戶在某一時間、某一網絡狀態、在某一地點,此時服務端返回的大數據就是這一時刻最有效、質量最高的節點。有預調度了,用戶如果發生位置或者網絡的切換,就不再是最佳節點。?有哪些維度能保證有效性??第一個,有效性。強制設置有效期,在有效期過了以后會強制重新調度一下隊列里面的一些結果。?第二個,網絡切換。因為分了兩塊緩存,一塊是WiFi的結果,一塊是4G的結果, 基于流量考慮(像4G,通常流量是比較敏感的。)如果網絡切換看到4G里面有結果了,把失去有效期結果的重新刷新一遍,有效期的繼續保留。(因為認為切回到4G的時候,它的運營商不變。) 切換到WiFi。安卓上面做了熱點的對比,切回到同一個熱點,邏輯跟4G一樣,但是IOS上面拿到這個熱點會有些障礙,我們無腦把它全部更新。因為WiFi下用戶對流量也不敏感。?
1.8 建連優化
2. 流解析優化首屏空間,解碼優化,渲染。
?解碼的時候FFmpeg里面有幾個比較重要的優化參數。?第一個,FFmpeg在拉到流首先會對視頻的首包進行解包操作。解包的過程當中會進行流的探測,比如解析到SPS或者PPS,拿到所有的meta信息,再分析每一線長度,這個本身很耗時。針對這種情況優化是直接指定視頻格式(一般客戶知道自己的視頻格式。如果接入自己的轉碼服務器,通常支持的格式也是主流的FLV或者MP4)這樣只要把格式植入進去就完全可以省略FFMpeg解析的時間。?第二個, 探測長度和探測時長(probesize/analyeduration)。這個探測主要的作用是解析當前視頻流音軌和視頻軌道的信息。采用動態下發機制來設置。理論上來說這兩個參數設置越小,首屏時間會越短。但是這也會帶來一些其它問題問題,有些異常的流,比如互動直播在一個連上上下麥的過程當中,混流的時候會出現前半段是音頻的連麥(音頻軌道流), 此時用戶以視頻形式上麥,混流的時候會同時混音頻流和視頻流。對于播放器這邊來說,播著音頻流突然來了個視頻流,探測時間如果太短就感知不到這種格式的流,會導致最后解碼器開不了。2.1?點播業務級別秒開優化-預加載
??在點播有業務級的秒開,類似于劃屏滾動,抖音這種滾到什么地方就播放什么地方。這里提供了兩種方式,第一種采用多實例,第二種就是采用DataSource。?多實例就是播放器性能。(自測之后發現,播放器性能以iPhone7為例來測,最多可能會同時開十個播放器,完全可以滿足這種場景)維護播放器的緩沖池。當用戶播放到當前預加載上下的幾個,這樣用戶在不停的滾動當中(數據因為已經加載好了,只需要調用一個播放渲染就可以了)也可以達到秒開的即時感。但是這種情況有一個問題,在低端機型上緩沖池的大小會受限制,因為同時它會開N個實例,這N個實例里面的解碼線程,渲染線程也會有N個,在低端機上吃不消。第二,帶寬搶占的問題。他們幾個同時去加載,上下幾個在正在占著帶寬,中間這個加載很慢。這種實現方式不是很靈活最根本在播放器。??Data source就是播放器提供了一組接口,第一種要給當前的Content Size。第二就是Play、Stop和Seek這種常規的操作接口。而應用層需要有完善的拉流機制和緩存機制,把所有拉回來的流作為Source data存在隊列里面,也可以根據自己的需求去拉某個優先級高的流,進行優先級排序,或者進行其他維度權重的排序。這樣整個秒開邏輯只需要用一個播放器就可以了。比如想用Data ?source 1 只需要按照播放器邏輯塞給播放器,播放器就會進行同步渲染。而如果播放到2(因為數據已經有了)渲染的性能正常的情況下打開是會在秒以內的。而且對低端機的性能要求不嚴格。?這樣做的缺點是大部分邏輯都需要應用層來維護,而應用層拉流機制和緩存機制可能會比較麻煩,但靈活度是最高的。做點播業務級優化的另外一個問題與秒開也是有關的。?2.2 無限循環
?無限循環在播放器內部就是播放到最后再Seek到開始。而在Seek過程當中每次都是請求重新建連Socket,發起HTTP請求建連。這種短視頻每次發起Socket都會有網絡請求、執行加載,用戶的體驗很不好。?針對這個進行優化,引入了本地緩存,邊下邊播功能:有兩份文件,原始數據文件,對應Map文件。Map文件對應的數據就是原始數據的時間段,因為有可能點播播放到某一個點,Seek到另外一個點,在文件寫入的時候中間會有個空洞,用Map就是來記錄到這個點跟點之間以及已經記錄的視頻段。用戶播的時候優先從原始的本地的文件里面進行Seek,就可以達到無限循環秒開的優化。?邊下邊播另外一種優勢是真的可以做到用戶即播即看,類似于引入了內部管理和外部管理的快播效果。比如說用戶想要優化本地緩存。就引入內部管理,視頻在播放器完成的時候把緩存消除,整個流程對用戶是不可見的。外部管理就是把內部緩存文件的路徑以及管理全部都委托給外部,用戶在播完的時候會拿到一個原始文件,這種文件根據它設置好的格式重新進行封裝后再發給它。??經過優化,去年負荷在經過引入調度之后,秒開率小于五百毫秒大概占43%,大于五百毫秒到一千毫秒有36.72%。整體秒開率能達到75%以上。?2.3 災備策略?
播放器優化過程當中遇到很多坑。比如網絡路由變換,在播放器從CDN某一個節點進行拉流的時候路由從4G變到WiFi。經過測試,如果從原節點拉流,可能有三種情況。第一種可以正常拉到流,第二種情況,沒有流,CDN直接就把流停了,第三種情況,會發出時間戳異常的流。這三種情況全是CDN的行為沒法預期。因此對于網絡變更,會引入自動重聯的機制。無論當前流是不是可靠,都會自動強制重連一次來保證流的魯棒性。?CDN服務停止,統計平臺會發生報警,通過兩種方式:一種服務端調整下發權重,讓用戶重新拉流;第二種是客戶端內部有重聯機制。如果重連會依次按照當前CDN節點順序,依次向下重連。第二個,遇到邊緣節點分配錯誤。這種是比較普遍的,(因為比如說有些之前遇到了一些個小的運營商,他介紹的運營商,在的CDN廠商的一個列表里面并沒有備份,比如說它是一個教育網,但是在CDN那邊,它可能誤認為電信網,這樣有可能發生最極端的情況,以前在新疆、西藏那邊的一個用戶,節點直接給調到了山東,這樣用戶可能根本拉不到流)在災備要及時發現并且反饋給CDN,讓CDN及時調整節點。第三種,CDN返回視頻流有格式錯誤。因為在推流端有QS機制不停刷新SPS跟PPS信息,而CDN在早期有可能會因為頻繁變更而導致它的數據錯誤,這樣就導致播放器無法做到兼容。還有一種情況,在做SEI透穿的時候,有一些CDN會把的SEI信息強制關掉,這樣也達不到所要的效果。??服務端災備核心策略就是盡可能多下發CDN,而CDN里面最可靠的是自己的CDN和原站,通常作為最保險的CDN下發。內部會專門監測CDN的平臺質量,它監測平臺質量分為兩個方面,第一個方面就是會有心跳上報機制定時探測每個CDN,以及CDN下面可能分配結點的活躍度。第二個方面根據播放器上報的卡頓率來評判,實時向調度服務器匯報CDN情況,根據匯報結果綜合計算來評判當前CDN到底是不是可靠。?客戶端的災備。在合適的時機進行切流,因為不管怎么樣不能讓用戶產生拉不到流的這種情況。最開始會逐條拉送,CDN下發回來之后會拉第一個地址,第一個地址異常會拉第二個地址,當所有地址都拉不到會從原始地址進行拉流,經過這一系列的災備再拉不到流,還會依賴于外部設置的重新調度,以及重新重試的機制進行第二次災備。而在播放過程當中會完全依賴重置機制,這個重置機制對外的接口里面給用戶開放了足夠的靈活度,比如重試幾次或間隔,或者在他需要的時候進行重試。這樣做既可以保證拉流成功率,也可以省去應用層開發工作量。?3. 總結??卡頓不是播放器端的問題,播放器能夠體現出用戶感知卡頓的結果,最終體現的應該是整個視頻鏈路的質量問題,發生卡頓肯定是鏈路上某個節點有問題。?秒開優化的根本是需要在首屏流程中把耗時的操作移除,這樣只要拿到了第一個數據包就馬上進行解碼渲染,最快給用戶呈現畫面。?鏈路質量需要有完整的質量監控體系。第一是監測鏈路質量。第二,幫助選擇最優的鏈路質量,持續優化過程,以備后面拉流的用戶來每次都可以拿到最高質量的流。?在拉流過程當中通過合適的切流措施和多CDN的災備邏輯來保證拉流成功率。
LiveVideoStack? 招募
LiveVideoStack正在招募編輯/記者/運營,與全球頂尖多媒體技術專家和LiveVideoStack年輕的伙伴一起,推動多媒體技術生態發展。同時,也歡迎你利用業余時間、遠程參與內容生產。了解崗位信息請在BOSS直聘上搜索“LiveVideoStack”,或通過微信“Tony_Bao_”與主編包研交流。
LiveVideoStackCon 2019北京 音視頻技術大會 初版日程現已上線,掃描圖中二維碼或點擊【閱讀原文】了解大會最新日程。
總結
以上是生活随笔為你收集整理的移动端视频缓存保障与CDN调度优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【大会】AI向多媒体各细分场景渗透
- 下一篇: Xilinx视频加速技术专场