1. 程式人生 > >《即時訊息技術剖析與實戰》學習筆記12——IM系統如何提升圖片、音視訊訊息傳送、瀏覽的體驗

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

IM系統如何提升使用者傳送、瀏覽圖片和音視訊訊息的體驗呢?一是保證圖片、音視訊訊息傳送得又快又穩,二是保證使用者瀏覽播放圖片、音視訊訊息時流暢不卡頓。 ![](https://img2020.cnblogs.com/blog/953680/202003/953680-20200314220718900-440434316.png) #### 一、提升使用者傳送圖片、音視訊的體驗 ##### 1. 多上傳接入點 針對不同的主流運營商提供不同的上傳接入點 IP,然後通過運營商 DNS 解析,讓使用者能通過本運營商的上傳接入點來快速上傳圖片和視訊;後端的圖片上傳儲存服務也可以部署在多線機房,這樣上傳服務也能快速地把檔案流提交給儲存層,從而避免從接入點到儲存服務的跨網開銷,也能解決其他運營商的使用者下載圖片時需要跨網的問題。 對於擁有多機房的公司,也可以只把上傳儲存服務部署在單線機房,然後再通過專線解決多個單線機房之間的訪問。 ##### 2. 上傳鏈路優化 把多媒體訊息上傳通道和普通訊息收發通道獨立開。 * 圖片、視訊 傳送圖片、視訊這樣的多媒體訊息時,先通過獨立通道上傳檔案流,上傳完成後會返回檔案的唯一標識 ID,然後再把這個唯一標識 ID 作為訊息的引用,通過普通訊息收發通道進行傳送。 * 語音 對於語音這樣的訊息,通過普通訊息收發的長連通道來分片上傳語音流,更方便通過長連來下推給接收方,避免使用者在播放語音時需要從遠端臨時下載檔案,使用流暢度會更好。 ##### 3. 分片上傳、斷點續傳和秒傳 ![](https://img2020.cnblogs.com/blog/953680/202003/953680-20200314220822062-577607103.png) #### 二、提升使用者瀏覽圖片、播放視訊的體驗 ##### 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檔案訪問鑑權 ![](https://img2020.cnblogs.com/blog/953680/202003/953680-20200314220855592-1647421277.png) 使用者通過上傳服務,把視訊上傳到服務端;服務端進行視訊的 HLS 切片並針對切完的 TS 檔案流進行加密,同時把金鑰儲存到金鑰服務中。 當有使用者請求該視訊時,CDN 節點從源站回源加密的視訊檔案,播放器先通過下載的 M3U8 索引檔案獲取到“金鑰地址”。 客戶端快取的認證 Token 拼接到該“金鑰地址”後面,再通過該地址請求鑑權服務,鑑權服務檢查攜帶的認證 Token 是否有許可權訪問該視訊檔案。 如果許可權沒問題,會從金鑰儲存服務中將該視訊的金鑰檔案返回給播放器,這時播放器就能自動解密播放了。 ##### 2. 時間戳防盜鏈 HLS 僅支援視訊的加解密操作,不支援圖片等其他格式的資源。針對其他格式的資源,可以採用“時間戳防盜鏈”的方案。 Token防盜鏈通過對時間有關的字串進行簽名,將時間,簽名信息通過一定的方式傳遞給CDN節點伺服器作為判斷依據,CDN 節點則會根據 URL 的加密形式,取出對應的過期時間,和當前伺服器時間進行比較,確認請求是否過期,過期的話,則直接拒絕;如果時間未過期,CDN 節點將根據約定的簽名演算法和密文,計算後的值和 URL 中的原始加密串進行比較;通過之後,請求會被認為是合法的。不合法的請求可以採取禁止訪問或其他