《即時消息技術剖析與實戰》學習筆記12——IM系統如何提升圖片、音視頻消息發送、瀏覽的體驗

  • 2020 年 3 月 14 日
  • 筆記

IM系統如何提升用戶發送、瀏覽圖片和音視頻消息的體驗呢?一是保證圖片、音視頻消息發送得又快又穩,二是保證用戶瀏覽播放圖片、音視頻消息時流暢不卡頓。

一、提升用戶發送圖片、音視頻的體驗

1. 多上傳接入點

針對不同的主流運營商提供不同的上傳接入點 IP,然後通過運營商 DNS 解析,讓用戶能通過本運營商的上傳接入點來快速上傳圖片和視頻;後端的圖片上傳存儲服務也可以部署在多線機房,這樣上傳服務也能快速地把文件流提交給存儲層,從而避免從接入點到存儲服務的跨網開銷,也能解決其他運營商的用戶下載圖片時需要跨網的問題。

對於擁有多機房的公司,也可以只把上傳存儲服務部署在單線機房,然後再通過專線解決多個單線機房之間的訪問。

2. 上傳鏈路優化

把多媒體消息上傳通道和普通消息收發通道獨立開。

  • 圖片、視頻

發送圖片、視頻這樣的多媒體消息時,先通過獨立通道上傳文件流,上傳完成後會返迴文件的唯一標識 ID,然後再把這個唯一標識 ID 作為消息的引用,通過普通消息收發通道進行發送。

  • 語音

對於語音這樣的消息,通過普通消息收發的長連通道來分片上傳語音流,更方便通過長連來下推給接收方,避免用戶在播放語音時需要從遠程臨時下載文件,使用流暢度會更好。

3. 分片上傳、斷點續傳和秒傳

二、提升用戶瀏覽圖片、播放視頻的體驗

1. CDN 加速

不用多說,我們都知道 CDN 的作用是讓資源離用戶更近。

  • CDN 加速

CDN 加速主要採取「拉模式」的策略。客戶端上傳的圖片、音視頻發佈到多個分佈在各地的 CDN 節點的服務器上,當有用戶需要訪問這些圖片和音視頻時,能夠通過 DNS 負載均衡技術,根據用戶來源就近訪問 CDN 節點中緩存的圖片和音視頻消息,如果 CDN 節點中沒有需要的資源,會先從源站同步到當前節點上,再返回給用戶。

  • CDN 預熱

在上面提到:如果 CDN 節點中沒有需要的資源,會先從源站同步到當前節點上,再返回給用戶。但如果是超高熱度的大型聊天室,可能用戶就近訪問的節點沒有需要的資源,則高並發的請求都被回源到源站,會對源站的帶寬和存儲帶來很大的壓力。

針對這個問題,可以採用「預熱」的方式,來提前強制 CDN 節點回源並獲取最新文件,減輕源站的壓力,提高資源的訪問效率。

2. 下載性能優化

圖片

  • 分辨率自適應

比如服務器對圖片生成幾種常見的低分辨率縮略圖,用戶點開時,根據終端的分辨率按需下載,「查看原圖」時再去加載大圖,這樣可以提升加載速度。

  • 格式優化

將上傳的圖片轉為 WebP 或漸進式 JPEG 格式。

前者可以在保持相同質量的前提下,比同樣的 PNG 或 JPEG 圖片小 30% 左右,但在 iOS 系統上的支持性不太好,需要一定的開發成本;

後者能夠在加載圖像時提供低分辨率的「預覽」,節省數據流量,提升圖像加載速度,加載體驗更好,但漸進式 JPEG 編碼比傳統基線 JPEG 的編碼速度慢了 60%,需要權衡性能和成本的平衡。

視頻

  • 邊下邊播

在播放器下載完視頻的格式信息、關鍵幀等信息後,播放器就可以開始播放,同時結合 HTTP 協議自帶支持的 Range 頭按需分片獲取後續的視頻流,從而來實現邊下邊播和拖動快進。

邊下邊播需要服務端支持 Range 分片獲取。

  • 視頻預加載

對視頻流進行「部分提前加載」,也就是所謂的「秒開」,可以提升用戶的體驗。

預加載可以按時間或者大小來限制。比如,我們可以設定預加載 3s 的視頻流,或者設定預加載 512KB 的視頻流。

  • 視頻轉碼

主流的視頻格式採用 H.264 編碼,H.265 是 2013 年新制定的視頻編碼標準。同樣的畫質和同樣的碼率,H.265 比 H.264 佔用的存儲空間要少 50%,但編碼複雜度遠高於 H.264(10 倍左右)。

因此在實現時,只選取部分熱點視頻來進行 H.265 編碼,降低轉碼開銷的同時來盡量提升 H.265 視頻的覆蓋度。

3. 推流

藉助即時消息自身的「長連接」通道,將音頻流、圖片或視頻的縮略圖推送下去,這樣就不會因為需要臨時從服務端獲取而出現卡頓了,減少加載耗時,提升用戶體驗。

三、保障用戶發送圖片、音視頻的安全性

1. CDN文件訪問鑒權

用戶通過上傳服務,把視頻上傳到服務端;服務端進行視頻的 HLS 切片並針對切完的 TS 文件流進行加密,同時把密鑰存儲到密鑰服務中。

當有用戶請求該視頻時,CDN 節點從源站回源加密的視頻文件,播放器先通過下載的 M3U8 索引文件獲取到「密鑰地址」。

客戶端緩存的認證 Token 拼接到該「密鑰地址」後面,再通過該地址請求鑒權服務,鑒權服務檢查攜帶的認證 Token 是否有權限訪問該視頻文件。

如果權限沒問題,會從密鑰存儲服務中將該視頻的密鑰文件返回給播放器,這時播放器就能自動解密播放了。

2. 時間戳防盜鏈

HLS 僅支持視頻的加解密操作,不支持圖片等其他格式的資源。針對其他格式的資源,可以採用「時間戳防盜鏈」的方案。

Token防盜鏈通過對時間有關的字符串進行簽名,將時間,簽名信息通過一定的方式傳遞給CDN節點服務器作為判斷依據,CDN 節點則會根據 URL 的加密形式,取出對應的過期時間,和當前服務器時間進行比較,確認請求是否過期,過期的話,則直接拒絕;如果時間未過期,CDN 節點將根據約定的簽名算法和密文,計算後的值和 URL 中的原始加密串進行比較;通過之後,請求會被認為是合法的。不合法的請求可以採取禁止訪問或其他操作。