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