何李石:七牛直播云技术详解
導讀:
6月30日,七牛在原有云存儲,云加速以及數據處理服務的基礎上,正式推出七牛直播云服務。這次發布,除了推出實時流網絡(LiveNet)作為全面支撐直播實時互動場景的傳輸網絡通道,同時也推出多平臺采集SDK,播放SDK以及云端API實現各種有針對性的直播功能。今天,小編推薦給大家的就是七牛布道師何李石對端到端,場景化 SDK技術參數的詳細解讀。
以下根據七牛云首席布道師何李石現場演講內容整理。
?
直播模型及其實現
一個通用的直播模型一般包括三個模塊:主播方、服務器端和播放端。
?
首先是主播方,它是產生視頻流的源頭,由一系列流程組成:第一,通過一定的設備來采集數據;第二,將采集的這些視頻進行一系列的處理,比如水印、美顏和特效濾鏡等處理;第三,將處理后的結果視頻編碼壓縮成可觀看可傳輸的視頻流;第四,分發推流,即將壓縮后的視頻流通過網絡通道傳輸出去。
其次是播放端,播放端功能有兩個層面,第一個層面是關鍵性的需求;另一層面是業務層面的。先看第一個層面,它涉及到一些非常關鍵的指標,比如秒開,在很多場景當中都有這樣的要求,然后是對于一些重要內容的版權保護。為了達到更好的效果,我們還需要配合服務端做智能解析,這在某些場景下也是關鍵性需求。再來看第二個層面也即業務層面的功能,對于一個社交直播產品來說,在播放端,觀眾希望能夠實時的看到主播端推過來的視頻流,并且和主播以及其他觀眾產生一定的互動,因此它可能包含一些像點贊、聊天和彈幕這樣的功能,以及禮物這樣更高級的道具。
我們知道,內容產生方和消費方一般都不是一一對應的。對于一個直播產品來講,最直觀的體現就是一個主播可能會有很多粉絲。因此,我們不能直接讓主播端和所有播放端進行點對點通信,這在技術上是做不到或者很有難度。主播方播出的視頻到達播放端之前,需要經過一系列的中間環節,也就是我們這里講的直播服務器端。
直播服務器端提供的最核心功能是收集主播端的視頻推流,并將其放大后推送給所有觀眾端。除了這個核心功能,還有很多運營級別的訴求,比如鑒權認證,視頻連線和實時轉碼,自動鑒黃,多屏合一,以及云端錄制存儲等功能。另外,對于一個主播端推出的視頻流,中間需要經過一些環節才能到達播放端,因此對中間環節的質量進行監控,以及根據這些監控來進行智能調度,也是非常重要的訴求。
實際上無論是主播端還是播放端,他們的訴求都不會僅僅是拍攝視頻和播放視頻這么簡單。在這個核心訴求被滿足之后,還有很多關鍵訴求需要被滿足。比如,對于一個消費級的直播產品來說,除了這三大模塊之外,還需要實現一個業務服務端來進行推流和播放控制,以及所有用戶狀態的維持。如此,就構成了一個消費級可用的直播產品。
但是正如剛才所說的直播通用模型一樣,實際上這里很多功能都可以抽象成一個通用功能,也就是說各家直播產品的需求和實現方式都類似。我們再來看,如果把這些抽象出來的需求交給七牛這樣的第三方去實現,會有多大的差異。
七牛直播云解決方案
首先,對于推流端的功能,我們可以用一個 SDK 去覆蓋所有功能點,包括采集、處理、編碼和推流等工作,若有一些功能無法通過官方提供的 SDK 來滿足,可以通過自定義擴展的形式來實現。
?
其次,對于播放端,我們可以將其功能分類,和視頻播放相關的功能可以通過一個播放器 SDK 去實現。而其它功能如實時聊天,可以直接使用其它第三方服務。
在直播服務器端,幾乎所有的工作都集中于如何更好的處理、分發視頻流,比如出于審核的目的對視頻進行自動鑒黃,為了更好的適配客戶端的網絡需要對視頻進行實時轉碼。
我們發現,對于這三個模塊,幾乎所有直播產品的訴求都是類似的。因此七牛提供了一個這樣覆蓋主播端到播放端的直播云解決方案,它包括推流端 SDK 和播放端 SDK,以及一個強大的直播網絡,它既能滿足推流端和播放端在拍攝和播放方面的體驗訴求,也能夠通過定制化的方式來滿足在產品運營方面的訴求,比如給播放器加上彈幕和點贊等功能。
七牛直播云平臺主要包含直播云 API、推流端 SDK 和播放端 SDK 等三大模塊。接下來重點介紹七牛在推流端和播放端 SDK 方面的功能特性,以及它們在性能方面的表現。
?
SDK 功能特性
1)SDK 處理流程
如果把一個完整的直播流程用一個流水線來表達,它應該是這樣子的,如下圖所示。
?
七牛 SDK 的開放性表現為兩點:
1. 數據采集源的開放性。我們提供了一個開放式的采集接口來進行視頻內容的采集,目前主要的采集源有手機屏幕采集和攝像頭采集。
2. 可插拔的數據處理模塊。對于視頻內容的處理,目前我們提供了美顏、水印和基本的濾鏡功能,但它其實也提供了一個開放式的處理接口。
除了開放性,七牛也支持了 H.264 和 H.265 等多種編碼標準。H.265 是一種更為高效的編碼標準,能夠在同等畫質效果下將內容的體積壓縮得更小,傳輸時更快更省帶寬。
視頻流編碼完成后,則進入另一個常規的流程,進行推流、分發和播放。這樣,我們就完成了一個完整的直播流程,它包含采集、處理、編碼、推流、分發和播放等子流程。其中每一個子流程都是可插拔可替換的,而所有流程的子模塊也都具有靈活開放的輸入輸出接口,子模塊可以被任意的擴展或者替換。
2)SDK 功能點對比
直播流程里面的模塊化處理方式中,每個子流程都包含一系列開放可擴展的子模塊,這些子模塊對應多組不同的功能,以滿足各階段的需求。我們匯總了一些當前主播、觀眾以及 App 實現者最關注的功能,大概有 36 種。從這張圖可以看出,目前七牛的推流端和直播端 SDK 中實現了多達 32 種功能。
?
3)SDK 包大小對比
但是,對于七牛直播服務來說,要做到這么開放,又具備這么多功能點,需要一個多大的 SDK 呢? 我們統計了一下,iOS 端的推流和播放 SDK 加起來,大概需要 5MB 左右,而業界的平均值則是 11MB。Android 端由于需要適配的硬件設備和軟件系統太多,SDK 的大小大概在 18MB 左右,業界的均值則在 42MB。
?
SDK 性能對比
我們提供了一個開放的 SDK 處理流程,在這個流程中每個環節都提供了非常豐富的關鍵功能,能夠滿足大部分場景下的需求,同時又保證了包含所有這些功能特性的 SDK 不會太大。那么,它在性能方面的表現如何呢?
1)資源占比
除了程序 Bug 導致的主動崩潰之外,一個 App 的穩定性主要由兩方面影響:內存和 CPU,因此第三方 SDK 在這兩方面的表現將直接影響 App 的穩定性。而對于一個視頻推流和播放 App 來說,CPU 是其最重要的資源之一。
?
我們先來看一下七牛 SDK 在 CPU 占比方面的情況。上下兩張圖分別是推流和播放 SDK 在經過多次反復測試后得出的 CPU 占比均值曲線圖。從圖中可以看出,無論是推流端還是播放端,七牛 SDK 在 CPU 使用率方面都占比最少。
我們再來看一下內存占比,上下兩圖也分別給出了推流和播放 SDK 在多次反復測試后得出的內存占比均值曲線圖,從圖中可以看出,我們 SDK 在推流和播放的時候內存使用情況表現非常平穩,而內存的使用量也在業界均值之下,接近于最好的值。這個數據之所以沒有達到最好值,是因為我們經過反復測試發現頻繁的對內存進行回收(Android)會導致編碼的不穩定,實際上這個指標確實可以優化到最好,只不過可能會導致內存和 CPU 波動較大,進而影響整個過程的編碼效率。對于這樣的權衡,我們大多數客戶也非常認可,這也是他們選擇我們的 SDK 原因之一,這點從我們 Github 庫上的關注度就可以看出。
2)耗電量對比
最后,我們再來看下在保證較好的推流效果和 App 穩定性情況下,它需要消耗多少電量。這兩張圖是推流和播放 10 分鐘得到的平均電量消耗對比,從圖中可以看出,七牛 SDK 在推流和播放情況下所需電量都是最小的,推流和播放分別只需要占用 App 總電量的 1.7% 左右(三星 S6 手機)。
?
總結
前面分享了這么多功能和性能的對比,我們再來回顧一下所有這些對比到底說明了什么:
首先,我們提供開放可插拔的模塊化組件,整個采集、處理和編碼過程都是非常開放的,每個模塊都可以非常方便的替換或者擴展。
其次,SDK 是開放性的,能夠方便地整合所有推流設備。我們認為所有端都應該平等地享受七牛的直播云服務,因此幫助所有端接入也是我們的服務宗旨之一。
最后,可量化的指標才有改善的空間,我們將幾乎所有指標都量化成指導 SDK 性能優化的數據,準確跟蹤服務客戶的質量,長期堅持不懈的改進 SDK 易用性、性能以及后端支撐網絡的效率。也即,優化到極致的推流播放性能和編解碼控制。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的何李石:七牛直播云技术详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机视频直播解决方案
- 下一篇: 编解码技术学习网站汇总