1.綜述
? ? ? ? 社交載體從文字發(fā)展到靜態(tài)圖片,現(xiàn)又來到了視頻的時代。在視頻時代,每個移動端app中的多媒體組件所需要承接的業(yè)務(wù)也越來越復(fù)雜,而且一家公司可能會出多款app,因此一個好的多媒體組件需要有靈活的擴展性以及方便的可移植性。根據(jù)這些需求,我們把一個多媒體組件(或者叫音視頻組件)拆分成源、渲染組件以及輸出幾個部分。
2.源(source)
? ? ? ? 目前移動端可能接受到的視頻源有攝像頭錄制的數(shù)據(jù)以及從手機存儲(包括SD卡)中的文件,未來可能還有AR設(shè)備或者其他外接設(shè)備所捕捉的數(shù)據(jù)(純YY)。因此我們需要一個通用的接口來封裝視頻的輸入源。并且從不同輸入員獲取到的數(shù)據(jù)送去渲染(可能還包括一些預(yù)處理,如色彩格式轉(zhuǎn)換、圖像分析等)的過程有點像生產(chǎn)者-消費者模型,因此我們還需要有一個管理數(shù)據(jù)緩沖隊列的組件來調(diào)控整個處理過程。
3.渲染(render)
? ? ? ?我們把視頻數(shù)據(jù)的預(yù)處理、添加額外特效(諸如動態(tài)貼紙、濾鏡、美顏等等)統(tǒng)稱為渲染,可能與傳統(tǒng)的“渲染”定義不太一樣,可以認為是一個“加特效”的過程。不同的特效的實現(xiàn)過程不盡相同,因此如何統(tǒng)一管理所有的特效;如何方便的修改、添加、禁止一個特效是“渲染”這個模塊需要考慮的。這邊還會涉及到與c層的交互,因此渲染模塊會是整個視頻處理中最復(fù)雜也是最核心的模塊。
4.輸出(sink)
? ? ? ? 當(dāng)所有處理完成之后,最后需要做的就是將這個數(shù)據(jù)通過一定的方式顯示出來,或者寫入某個文件,或者推流到服務(wù)器上,這個工作就交由輸出模塊來完成。因為“輸出”的形式也是多種多樣的,因此這邊也需要有一個統(tǒng)一的管理以及良好的擴展。

關(guān)于渲染的分層
1.上層業(yè)務(wù)
? ? ? ?諸如動態(tài)貼紙、濾鏡、ar等等特效在不同的項目中有著完全不一樣的配置,包括數(shù)量、順序、交互、資源等等,因此這些做為強業(yè)務(wù)向的配置邏輯需要有獨立的管理類去控制。
2.公共業(yè)務(wù)
? ? ? ? 雖然在不同項目中配置項各有各的不同,但是繪制的內(nèi)容基本是可以枚舉的,因此動態(tài)貼紙、濾鏡、ar等這些會被歸為公共業(yè)務(wù)。
3.底層庫
? ? ? ? 對于繪制的基礎(chǔ)功能則是一個通用的、抽象的接口,可參考安卓系統(tǒng)GUI系統(tǒng)來設(shè)計整個繪制底層框架
