天天看點

基于架構式的短視訊APP開發 SDK 架構設計實踐

那麼我們需要用到哪些已有的架構或者已有的項目來完成這個功能呢?可以思考下,既然有預覽界面,則一定需要視訊播放器。播放器的基本功能包括了解碼和音視訊的渲染,此外再加上邏輯控制、音視訊對齊就可以成為一個視訊播放器。

視訊播放器中視訊解碼子產品是非常重要的,通過它可以将視訊檔案解碼為視訊幀,并且輸出到解碼紋理隊列中,接下來就是本App最核心的工作——處理,視訊處理子產品會按照時間戳将對應的紋理進行處理,并放入到渲染隊列,最後輸出子產品會将渲染隊列中的紋理輸出到螢幕上,而在離線儲存場景下,則是将渲染隊列中的紋理編碼輸出到本地,也就是封裝成mp4或者flv等等格式寫入本地磁盤。

接下來介紹一下我們團隊在進行短視訊APP開發 SDK 實踐中主要做的一些事情,這其中最重要的就是短視訊 SDK 的架構設計,包括架構設計理念、架構圖、整體資料流程、子產品架構設計等。

第一點我們遵循的是高子產品化、子產品可插拔的一個理念;高子產品化必須要保證每個類每個方法都「名副其實」并「各司其職」,這樣才能編寫更清晰的邏輯;高子產品化同時可以促進高複用,減少重複代碼;短視訊 SDK 内的轉碼核心類,因為編輯、剪輯在最後儲存的時候都需要一個解碼并重新編碼的過程,在這裡,轉碼核心類可以達到一個高複用。

不同的功能放在了不同的包體當中。我們并沒有使用 ffmpeg 的軟解軟編,而是盡量使用 Android 和 iOS 的系統 API 進行硬編硬解,這樣不僅減少了包體大小,而且速度要快很多,盡管在技術層面上會增加很多難度,會踩很多坑,但我們還是堅持選用這個方案。在引入第三方庫時,我們也都是會經過充配置設定置和裁剪去嚴格控制包體的大小,這樣一來,所有包體總和才能有現在「小而精」(1.5M)的成果。表中最後的内置濾鏡子產品,其中的濾鏡資源可以選擇性拷貝,SDK 内部會自動判斷。這是關于子產品設計方面的一些理念。

第二點是要和 UI 解耦,是從不同 App 中截圖得到的畫面,可以看出每一個App 都有各自的設計,作為一款短視訊 SDK,是絕對不可以在 UI 方面限制客戶發揮的。市面上有些短視訊 SDK 将 UI 寫死并作為 SDK 的一部分,這樣對于客戶在設計 UI 界面上來說,是非常不友好的;我們采用的是另一種方法,SDK 與 UI 進行解耦,客戶的 UI 是可自定義的,整個 SDK 中接受 view 的地方隻有一處。

接着是擴充性這一塊,我們遵循高擴充,開放性的理念。在錄制以及編輯過程中,都會有資料的回調并支援第三方庫進行美顔濾鏡SDK,動态貼紙SDK,特效等功能。

最後是關于可配置參數方面的設計,除了正常參數,比如攝像頭分辨率和幀率、麥克風采樣率等可以進行配置之外,包括美顔等參數我們也都是可以進行配置的。

繼續閱讀