短視訊架構設計實踐
背景
在多媒體領域,為給使用者提供優質生動直觀的便捷服務,從最早的圖文場景已經發展為視訊、直播的展現形式,以及目前熱門的AR、VR應用。58集團旗下眾多業務線,基本都有短視訊應用的場景,比如安居客視訊看房,車商通看車等,以更直觀、便捷的視訊形式為使用者和商家提供服務。58短視訊sdk作為通用的視訊處理平臺,需要在架構設計上全面考慮,幫助各個業務線聚焦於業務本身,根據業務場景,快速輕鬆實現短視訊內容業務。
短視訊APP的難點
短視訊從流程上主要包括採集、處理、編碼、封裝、解碼、渲染等。其中有很多技術點需要我們解決優化。
-
多媒體領域技術門檻高
音視訊領域高門檻,音視訊技術自身具有一定的技術門檻,需要具備一定的音訊和視訊處理基礎,比如視訊封裝格式、音視訊編解碼器知識,以及理解掌握不同的音視訊編碼格式如opus、aac、h264,還有主流的開源框架ffmpeg等。
-
圖形影象處理,對OpenGL 的運用掌握
對於移動端視訊處理,當然離不開OpenGL,android的OpenGLES,iOS的GPUImage。對攝像頭預覽資料或者匯入的資料進行處理,需要了解色彩空間的資料格式如RGB/YUV,以及它們之間的轉換實現等,運用OpenGL完成渲染,新增各種特效、濾鏡,包括圖層混合,縮放、影象裁剪、旋轉等。
-
適配性問題
短視訊開發,會遇到很多機型適配問題,從攝像頭的採集,android軟硬編呼叫策略。而且要掌握不同平臺的多媒體處理的API,不同機型和系統版本等都會帶來相容性問題。
-
高階功能實現成本問題
要實現視訊編輯處理的高階功能如美顏、濾鏡、特效、水印等,要考慮到開發成本、設計成本,並且這些高階功能對各方面技術要求也比較高。
-
效能問題
-
在終端實現複雜計算時要考慮到系統的支援能力,因此在進行媒體資料採集、渲染、編碼等複雜計算時,要合理解決效能問題,考驗開發的調優能力。
58短視訊sdk為解決上面的難點,從架構上進行了詳細考慮和設計,解決了業務線進行短視訊相關內容業務開發中的難點問題,使業務線能夠更聚焦於業務本身,根據業務場景,快速實現短視訊功能。
58短視訊架構
58短視訊sdk從可擴充套件性和高模組化、高複用出發,對58短視訊進行了整體架構設計。比如業務線可以靈活替換編解碼庫,對AR的支援等。
短視訊sdk設計原則及目標
-
高模組化、高複用
模組化設計,保證每個模組動能獨立、邏輯清晰;模組可插拔複用,減少重複程式碼,提高效率;同時高模組化可以促進高複用,如編碼元件在視訊錄製、編輯、直播推流等都會複用到。
-
與UI、業務邏輯解耦
sdk的實現要隔離UI及業務層邏輯,這樣接入方可自定義UI並實現自己的業務邏輯需求。
-
可擴充套件性
如sdk支援人臉識別,要考慮業務方若已經實現了人臉識別,並希望替換掉sdk的人臉識別,就要求sdk能夠支援第三方庫來實現。在錄製及編輯過程中,提供資料回撥介面支援業務線使用第三方庫對資料進行濾鏡、特效、貼紙等自定義需求實現。以及在架構設計上,要可擴充套件加入新的技術方案,如編解碼庫的替換,對AR的支援等。
-
自定義配置引數
在錄製及編輯模組,可以配置解析度、位元速率、幀率、編碼格式等,後續也要支援配置濾鏡的引數。
遵循上述的設計理念,短視訊sdk在架構設計上重點關注模組化、元件化;所謂模組化是指提供一個完整的功能實現模組,如錄製模組,其提供的功能就包括資料採集、處理、編碼、合成整個流程;元件化是指將一個功能進行封裝,這個功能的粒度比模組化更小、更獨立,如視訊資料採集元件、音訊資料採集元件、硬編碼元件等。封裝實現了元件後,一個模組就由多個元件構成,加上介面層的回撥、生命週期的控制等實現一整套完整的功能。
在進行元件封裝的時候,要考慮功能粒度的劃分,既要提供一個獨立的功能,又不可以拆分的太細,要保證其完整的能力。模組化的設計實現上,要考慮其完整功能的各個流程,又要可動態依賴不同元件實現其靈活性,如錄製模組,可以根據需要,在編碼元件上,選擇使用硬編碼元件,或者軟編碼元件,或者同時使用這兩種元件。
架構設計
短視訊sdk從上到下分為業務層、包裝層、模組層、元件層、核心層。其中業務層和包裝層是對接入方開源的,可以通過這兩層實現UI及業務邏輯。
58短視訊sdk整體架構:
1. 業務層
該層就是業務方的實際專案,具體的使用,修改,由業務方完成。短視訊sdk擴充套件性強、並支援二次開發,滿足業務放的大部分需求。就比如你買來一臺電腦,可能是用來玩遊戲、可能是用來做伺服器、也可能是用來做嵌入式物聯網,多種需求均可滿足。
2. 包裝層
該層是短視訊sdk對外提供的帶基礎介面互動的包裝層,例如視訊錄製(recorderwrapper)、視訊編輯(editorwrapper)、播放器(playerwrapper)。
該層是通過對模組層的包裝,加入了介面互動和一定的業務邏輯,再通過MVP形式,對業務方提供。業務方可根據自身需求,或選擇直接使用、或選擇修改介面的表現形式、或選擇修改業務邏輯。可以理解為我們提供了一臺已經組裝好,並且裝好主機外科、配好外設、打上logo的一臺電腦,業務方可自己修改電腦外觀、更換外設、或是直接使用。
3. 模組層
該層主要是對外提供的完整視訊功能,例如視訊錄製(recorder模組)、視訊編輯(editor模組)、播放器(player模組)等等。
該層是通過對核心層的呼叫,對元件層的使用,再加入一些流程控制、生命週期、對外介面、回撥等,完成一整套視訊功能的模組層。可以理解為我們賣的一臺已經組裝好的電腦,線路已經梳理好,部分硬體已經安裝完成,然後只需要使用方,根據自己的需求,選擇一些可選的硬體(依賴注入)。
4. 元件層
該層主要是視訊的基礎元件,例如音視訊的採集(capture模組)、視訊編碼(codec、軟硬編模組等)、特效(timeline、action模組)等等。
該層是抽象出來的視訊模組,是底層核心層的實現層,業務線可根據自身業務需求,選擇不同的元件模組。可以理解為電腦的顯示卡、CPU、儲存、電源等硬體。
5. 核心層
該層對應的模組為`core`模組,該模組內部提供介面、工具類、基礎資料結構、專案內常量等。
該模組會被所有其他模組引用,是面向介面程式設計的基礎。我們可以理解該模組就相當於主機的主機板,提供各式各樣的介面,具體插什麼配件,完全由業務方選擇。
短視訊sdk架構設計的優勢和應用效果
架構優勢
-
通用性
短視訊sdk從編解碼到特效處理,都具有豐富的視訊功能,可以支援不同業務線根據場景需要,定製化實現視訊功能。
-
靈活性
對於接入方業務線,業務層、包裝層是提供原始碼給業務線使用的,這兩層與sdk的模組層、元件層是完全解耦的,業務線可根據需求定製業務場景,實現自己的業務封裝和UI設計;模組化的設計,可以靈活選擇合適的元件進行組裝實現一個模組。
-
複用性
不同模組可複用一個元件,減少程式碼冗餘,方便後續的維護、升級、修復元件問題等。
-
可擴充套件性
元件提供的功能是獨立的,可升級或者替換一個元件,如增加支援h265編碼的元件;可將AR運用到短視訊sdk,提供AR元件,增加一個AR編輯模組等。短視訊sdk具備高可擴充套件性,業務方可以根據實際需求選擇整合。如錄製模組呼叫的編碼元件,只整合硬編碼方式mediacodec,這樣能有效的減少包體積並保證高效能,也可以為了相容低系統的手機同時整合ffmpeg+x264和mediacodec,這樣不受限於硬編碼的系統要求,能夠覆蓋更多的手機提供給更多使用者使用。
應用效果
未來架構的功能演進
元件化、模組化的設計,可使短視訊sdk方便靈活的擴充套件新的元件及靈活組合選擇需要的元件,也可以根據新支援的元件,封裝出新的模組。基於這個架構設計,在未來sdk可以在以下方面擴充套件能力:
-
增加硬解碼元件
-
增加AR元件
-
增加h265編解碼元件
-
增加人臉識別元件
-
錄製、編輯、推流模組擴充套件支援硬解碼
-
可封裝新的模組如AR錄製模組,AR特效編輯模組,AR推流模組,也可以在原模組下支援AR相關的功能
當然,隨著軟硬體技術發展,還有很多未知、充滿挑戰、有趣的功能在等著我們。短視訊sdk也在持續優化,以支援未來技術發展。
總結
本文主要介紹了短視訊APP的技術難點以及58視訊sdk架構設計。我們將持續豐富視訊sdk的功能,保證其穩定性和高效能,致力於將短視訊sdk打造成為一個通用的視訊處理平臺,集視訊拍攝、編輯、處理合成等功能於一體,滿足業務線各種可定製化的需求場景,讓業務線可以快速、高效的整合使用,實現視訊類產品需求的快速轉化,更好的服務於使用者。