短視頻架構設計實踐

背景

在多媒體領域,為給用戶提供優質生動直觀的便捷服務,從最早的圖文場景已經發展為視頻、直播的展現形式,以及目前熱門的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打造成為一個通用的視頻處理平臺,集視頻拍攝、編輯、處理合成等功能於一體,滿足業務線各種可定製化的需求場景,讓業務線可以快速、高效的集成使用,實現視頻類產品需求的快速轉化,更好的服務於用戶。


歡迎大家關注“58架構師”微信公眾號,定期分享雲計算、AI、區塊鏈、大數據、搜索、推薦、存儲、中間件、移動、前端、運維等方面的前沿技術和實踐經驗。

相關推薦

推薦中...