天天看點

分片壓縮、分片上傳,融雲 IM 視訊檔案高速傳輸方案

作者:融雲

在 IM 消息管理中,多種類型消息的傳輸處理是服務可靠性的關鍵。關注【融雲全球網際網路通信雲】了解更多

通常,發送消息前,融雲 IM 會将發送的媒體檔案上傳到預設檔案伺服器。

而在文本、表情、圖檔、語音、位置、小視訊等各種消息中,以小視訊的傳輸對網絡等條件的要求最高,其檔案更大、上傳時間更長,而上傳速度會直接影響收發消息的體驗。

分片壓縮、分片上傳,融雲 IM 視訊檔案高速傳輸方案

主流 IM 應用會将傳輸的視訊檔案整體做編碼,使用者收到視訊後需要等待加載後才能檢視,這顯然會對使用者體驗造成一定影響。

在這一細節能力上,融雲使用了分片壓縮、分片上傳的整體方案,對每個步驟做了深度優化,極大提升視訊傳輸速度,讓使用者收到即可馬上檢視視訊檔案内容。

視訊檔案分片壓縮

視訊檔案通常較大,在資源有限的移動裝置硬體中傳輸,需要通過分片壓縮的方式提升資源使用率和傳輸速度。

視訊編碼

視訊編碼指通過特定技術對視訊檔案進行編碼壓縮,以便于網絡傳輸和降低帶寬壓力。

常見的視訊編碼方式有 HEVC(H265)、AVC(H264)、DIVX 等,其中 H265 的品質是最高的,但因有些軟體或硬體裝置無法相容,其并不是目前的主流編碼格式。

我們通常選擇 H264 的視訊編碼格式,同等大小的視訊可以保持相對較高的清晰度。

視訊編碼的基本參數主要有碼率、幀率、分辨率。

碼率(比特率),指機關時間内傳送的比特(bit)數,即每秒鐘的視訊所包含的資料量,在分辨率已經標明的情況下,調低碼率能夠有效降低視訊的大小。碼率越小,視訊就會越小。

比特率編碼主要有恒定比特率(CBR)、可變比特率(VBR)以及多比特率(MBR)編碼模式三種編碼方式,我們選擇 CBR,并且調低數值(有些應用無法設定編碼格式,隻能調數值),一般來講比特率越低則視訊越小。

幀率,是視訊每秒鐘播放的圖檔數目,幀率越小,感受上看到的視訊就越卡。一般而言,大于 24 幀每秒對于肉眼來說看到的就是流暢視訊了。

通常,視訊幀率保持在 25~35 即可,過高的幀率對視訊品質的提高并不會有太大幫助,反而會影響導出的效率。

分辨率指視訊的精細程度,分辨率越大,視訊的内容就越精細。

在這方面,保留視訊原有的分辨率即可,如果是高清視訊想要舍棄一些清晰度來縮小,則可以按照寬高比例進行設定。

分片壓縮、分片上傳,融雲 IM 視訊檔案高速傳輸方案

壓縮原理

視訊壓縮的目标是:在確定清晰度的前提下最大程度降低視訊大小。

我們可以圍繞上述視訊編碼幾大要素,反複嘗試出一個清晰度較高且最大程度壓縮視訊大小的标準。

計算視訊大小的公式為(音頻碼率 / 8+視訊碼率 / 8) x 視訊時長。由此可見,通過删減視訊長度或降低碼率即可達成壓縮視訊的目标。

時長固定的情況下,控制碼率便成為壓縮視訊的關鍵。當然,但碼率也不可随意極限調低。假使我們把分辨率比作一個盒子,碼率就是撐起這個盒子需要放置的物品,多則浪費,少則不滿進而影響清晰度。

這就需要找到二者之間的最佳比例,常用的分辨率和碼率的選擇區間為:

分片壓縮、分片上傳,融雲 IM 視訊檔案高速傳輸方案

融雲采用的壓縮參數

NSInteger bitrate = videoSize.height * videoSize.width * 2;
    session.videoSettings = @{
            AVVideoCodecKey : AVVideoCodecH264,
            AVVideoWidthKey : @(videoSize.width),
            AVVideoHeightKey : @(videoSize.height),
            AVVideoCompressionPropertiesKey : @{
                AVVideoColorPrimariesKey : AVVideoColorPrimaries_ITU_R_709_2,
                AVVideoAverageBitRateKey : @(bitrate),                  // 比特率
                AVVideoProfileLevelKey : AVVideoProfileLevelH264High40, // 壓縮算法
            },           

舉例來說,融雲預設允許上傳 2 分鐘時長的視訊,通常分辨率 1280x720(720P)下,蘋果裝置錄制視訊的原檔案大小為 120M 左右,經過壓縮後,大小可降低至 44M,保障清晰度的情況下,有效壓縮率為 37% 左右。

視訊檔案分片上傳

分片上傳支援将一個檔案切割為一系列特定大小的資料塊,每個小資料塊以一個獨立的 HTTP 請求分别上傳,以保證較大視訊檔案的傳輸速度。

所有小資料塊都上傳完成後,發送一個請求給服務端将這些小資料塊組織成一個邏輯資源,即獲得原始視訊檔案,整個分片上傳過程就此完成。

分片上傳優勢

☑适合尺寸較大的檔案傳輸,通過分片來避免單個 HTTP 資料量過大而導緻連接配接逾時的現象。

☑在網絡條件較差的環境下,較小尺寸的檔案可以有較高的上傳成功率,進而避免無休止的失敗重試。

☑失敗重傳不需要整個檔案從頭開始,隻需要重傳此分片,有效提升上傳效率。

☑并行分片上傳,利用對象存儲 OSS(Object Storage Service)的并行處理能力,網絡環境影響可以降到最低。

☑移動端裝置硬體資源優先,分片上傳可以有效降低大檔案上傳時的記憶體占用,防止記憶體溢出。

融雲分片政策

在分片上傳中,分片政策是一個重要的挑戰點。

分片太大,片數少,上傳的并發度不夠,可能會降低上傳效率,每個大的分片在失敗後重傳的成本會比較高;分片太小,片數多,并發需要的 TCP 連接配接太多,多條 TCP 連接配接的“視窗慢啟動”會降低整體吞吐,兩端拆分與合并分片的開銷也相應增加,而且傳輸時的額外流量(HTTP 報頭)也會更多。

融雲采用的分片政策是,綜合考慮 2 分鐘時長的視訊壓縮後大小為 44M,每個分片大小 5M,大緻可分為 9 片并行上傳,采用 4 個線程,有效利用網絡帶寬。

這樣,融雲 IM 傳輸的視訊檔案,在經過第一步的分片壓縮後,再通過并行分段上傳實作多線程上傳,充分利用可用帶寬,大大縮短上傳時長。

此外,針對國内和外海客戶的不同需求,融雲完成了與多家 OSS 廠商的對接,可根據客戶市場需要,定制化配置最優 OSS 服務商,保障伺服器資源的高可用,實作視訊檔案的高速傳輸。

繼續閱讀