Instagram视频上传延迟优化
視頻傳輸延遲,尤其是在某些互動社交環境中,會嚴重影響用戶的體驗。Instagram多年來以降低視頻上傳延遲為重要指標,實現了多種優化策略。本文來自Instagram媒體基礎設施團隊軟件工程師Ryan Peterman。
文 / Ryan Peterman
譯 / 蔣默邱澤
原文
https://instagram-engineering.com/video-upload-latency-improvements-at-instagram-bcf4b4c5520a
2013年6月,Instagram推出視頻上傳功能。當時系統功能很簡單,為了攝取視頻并用于播放。我們讓Instagram app在客戶端完成錄制后將整段視頻文件傳至服務器,然后我們將視頻轉碼為一組質量可控的視頻版本,以確保視頻文件可以在盡可能多的設備上播出。一旦所有視頻都可用我們就“發布”供用戶觀看。
一個簡單視頻上傳流程
Instagram在社交環境中對上傳時間反應尤為敏感,用戶希望其他人可以盡快看到他們的視頻故事和實時消息留言。出于這個原因上傳延遲是Instagram一個非常重要的指標。多年來,我們開發出了多種減少延遲的策略。
讓我們首先定義本文中的上傳延遲,即服務器從客戶端接收到所有視頻碼率信息,直至視頻"可發布"或可供查看為止。
發布內容
減少視頻上傳延遲最簡單的優化是在視頻被發布前盡可能減少步驟。我們的想法是在所有視頻版本都可用之前,先將可用的最高質量視頻版本發布出去。其余視頻可用于回放并非強制性,可以為帶寬弱的用戶提供較少卡頓的回放體驗。這樣可以有效降低處理低質量視頻比高質量版本花費更多時間而造成的延遲,極大程度上提高了視頻上傳的成功率。因為我們只依賴一個版本而不是所有質量版本。
發布內容僅取決于高質量的版本
我們使用基于圖形的存儲系統來表示視頻數據模型,所有視頻版本"視頻資源附加到父節點,這允許上傳的視頻被判斷為媒體級別而不是視頻版本級別。這種抽象實現了簡單統一的發布邏輯。為了實現上述改進,我們將視頻資源標記為“可發布的”,當我們通過視頻處理服務收到回調信息時在視頻資源中進行翻轉布爾值。
通過讓發布信號只依賴于一個版本,使得我們的視頻處理模型更具彈性和靈活機制。如果通道在一段時間內無法生成可選編碼,我們仍然可以準許發布視頻,因為我們擁有最高質量版本。之后我們可以按需補充其余版本。
為了使發布信號只依賴于最高質量的版本,帶寬受限的用戶可能會體驗次優的回放體驗,直到其余版本完成為止。例如,只要最高質量的版本準備好了,視頻就會發布,但是可能還有一些低質量的版本正在處理中,這些版本要到稍后才能發布。當帶寬受限的用戶最初觀看視頻時,如果只有最高質量的視頻可用,他們可能會體驗到相對較高的卡頓率與失幀率。而實際上在絕大多數情況下,編碼的其余部分在強制的版本完成后也會迅速可用。
視頻切片上傳處理
另一種加快視頻上傳速度的方法是讓客戶端在視頻錄制完成后對其進行切片。一旦視頻被切片,客戶端就會把它們上傳到服務器上,并給每個切片加上索引,以便后續可以按順序重新組合。當服務器接收到視頻切片時,并行地進行代碼轉換,從而節省時間。一旦所有切片都被轉碼,將其組合在一起,就可以進行播放。
通道處理部分被切片且并行
在服務端,我們將每個視頻處理流水線構建為有向非循環圖。每個節點都是執行單元,每個邊則代表兩個節點間的依賴關系。每個節點在所有依賴項完成后執行運行。這里的示例是基本非分段通道簡化處理視頻過程:
在示例中大部分工作都發生在轉碼節點中。如果能并行化這部分,我們就可以顯著減少上傳延時。切片通道旨在通過為每個片段添加轉碼任務來并行化該部分。然后,添加一個拼接任務,將每個片段的視頻幀連接起來,放在一個新的容器中。此拼接任務取決于通道每個片段任務,如下圖:
在多數情況下切片上傳只會減少上傳延時,但質量權衡還有其他復雜性。例如:切片上傳會增加通道復雜性。有一些質量指標會在轉碼時用于每個案例如SSIM。這些指標對我們每個細分受眾群沒有幫助。但是我們需要對所有片段的SSIM進行持續時間平均加權,以得出整個視頻的SSIM。同樣處理異常更加復雜,因為要處理非常多數量的計算單元。
此外通過切片視頻,我們在通道引入另一個步驟將所有轉碼片段拼接在一起。這需要更多CPU處理,若是非切片則不必。重要問題是拼接步驟在最終系統中明顯增加了I/O要求,每個片段在單個機器進行轉碼拼接時我們希望執行拼接處理。因此其他節點必須從網絡下載所有片段這會大大增加I/O利用率。
在切片長度上我們會處理的非常小,這樣可以并行完成更多任務。然而,由于設置節點對切片進行轉碼時存在一些必須開銷,因此我們將切片長度保持在某個閾值以上。如果切片長度細分的太小,那么必然浪費資源。實際上將長度設置為大約幾秒的時間對我們來說足以。
此外就上傳延時而言,這并不總是全勝法子。隨著初始視頻縮短切片上傳的好處也相應減少了。例如:下面描述了短視頻和長視頻的非分段視頻處理和分段視頻處理相對于時間的比較。對于這兩者,我假設視頻處理時間與視頻長度成正比圖。Δt 是切片和非切片通道執行之間的上傳延時。與長視頻相比,短視頻的獲勝幾率要小得多:
總的來說,我們決定在上傳過程的開始階段根據產品和視頻的長度對視頻進行切片。某些視頻產品(例如故事情節)已經強制規定了長度的最大值,這些最大值足夠短,切片不需要特別復雜。對于像IGTV這樣的視頻產品,規定了最小長度,這樣有足夠的長度使得分片上傳是有價值的。
透傳
我們用來改進上傳延遲和節省CPU利用率的另一種性能優化稱為“透傳”上傳。在某些情況下,上傳的媒體已經可以在大多數設備上播放了。如果是這樣,我們可以完全跳過視頻處理并將視頻直接存儲到數據模型中。這樣不僅減少了延遲而且在這種情況下我們不需要對視頻進行轉碼。
?透傳檢測是發布前的關鍵
這是一個非常重要的檢查步驟,以便進入Instagram的視頻符合我們的播放標準。除了視頻轉碼通道外,我們還添加了另一種通道用于檢測傳入視頻的特定屬性。例如:編解碼器和碼率,以確認是否視頻符合透傳的條件。如果視頻的解碼器支持較少,那么能夠播放視頻的Instagram用戶就會更少。類似地,如果比特率過高,則通過網絡加載用于回放的視頻將花費太長時間。
一旦解碼器和碼率通過我們的篩選標準,我們就會使用內部工具檢查視頻文件;該工具報告拓撲、一致性和存儲流一致性。如果視頻文件不一致,嘗試修復原視頻文件會被啟用。這個內部工具可以可靠的識別緩沖區溢出場景,使得我們不會向用戶提供任何惡略質量文件。最后我們將修復后的視頻與原始視音頻一起轉碼并存儲在我們的數據模型中:
由此產生的透傳通道比轉碼通道完成得更迅速。我們檢查確保視頻版本的可播放性,因此系統允許將資源池視頻回調并標記發布狀態。這極大地改善了視頻處理延時并提高了視頻質量,因為轉碼是一個有損的過程。
這里的權衡也取決于我們設定的碼率上限,其原因有幾種:如果原始視頻的碼率太高并且執行透傳上傳,那么我們將存儲比轉碼視頻時更大的文件。此外,隨著碼率的增加視覺質量反而在減少,當這些內容在屏幕尺寸有限的移動設備上播放時則更加明顯。而高碼率的原始視頻在透傳版本與高質量轉碼版本比較時,獲得的視覺質量優勢較小。實際上,我們的比特率上限允許我們控制這些權衡。
總而言之,透傳對于依賴延遲的視頻產品尤其有用。
下一步呢?
多年來,Instagram的視頻處理能力有了顯著提高。這種基礎設施以高效、可靠和高質量方式為全球用戶提供了豐富的價值。我們也在致力于使上述程序更加高效簡單。
隨著視頻的老化和與外界的互動,一個最有希望的領域是根據需要生成和清除編碼。
例如,我們可能希望根據流行程度或視頻的年齡等數據更改某個視頻的表示形式。由于舊的內容沒有那么多的觀看,我們不可能存儲所有的視頻版本。取而代之的是,我們可以只為那些看起來很久以前的小流量設置一個視頻版本的子集。如果一個舊視頻突然流行起來,那么我們可能會根據需要重新生成這些版本。
設計一個系統來管理我們在每個視頻生命周期中所擁有的視頻表示形式涉及到許多有趣的挑戰。我們應該選擇使用什么信號?如何快速有效地管理和迭代現有的視頻?
LiveVideoStack? 招募
LiveVideoStack正在招募編輯/記者/運營,與全球頂尖多媒及技術專家和LiveVideoStack年輕的伙伴一起,推動多媒體技術生態發展。了解崗位信息請在BOSS直聘上搜索“LiveVideoStack”,或通過微信“Tony_Bao_”與主編包研交流。
點擊【閱讀原文】或掃描圖中二維碼,了解更多大會講師及分享內容信息!
總結
以上是生活随笔為你收集整理的Instagram视频上传延迟优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 张光:鸿沟已成坦途
- 下一篇: LiveVideoStack线上分享第三