2017 年,短視頻成爲了創業的新風口,各類短視頻 App 如雨後春筍般前後上線,視頻愈來愈像文字、圖片同樣,成爲每個 App 不可或缺的一部分。
1. 包體必定要儘量小
如何作到儘量的減少 SDK 的包體呢 ?
- 盡一切努力使用 Android/iOS 系統
原生的 API
,不怕難用,不怕踩坑
- 良好的模塊劃分,
不一樣的功能生成不一樣的動態庫
,客戶可選擇性的拆卸和裁剪
- 所使用的第三方庫,充分配置編譯選項和功能裁剪,只打包必須的功能、單獨抽離所需的模塊
2. SDK 必定要開放
使用第三方的 SDK,最怕像個黑盒,過於封閉,想配置的參數沒法配置,須要的狀態也沒有回調,直接致使產品經理給出的 UI 和交互方案沒法實現。所以,SDK 的開放性,愈來愈成爲開發者選型的關鍵因素。
那麼,SDK 如何作到儘量的開放呢 ?
-
凡可配置的參數,一概提供配置
,好比:攝像頭參數、編解碼參數、美顏參數、混音參數等等
-
凡可回調的數據,一概提供回調
,好比:攝像頭採集的視頻幀、紋理 ID,麥克風採集的音頻幀等等
-
凡運行過程當中的狀態,一概提供通知
,好比:拍攝狀態、轉碼進度、取消事件等等
另外,還須要儘量地跟 SDK 上下游廠商創建良好的合做關係,好比 美顏、濾鏡、人臉貼紙特效、大眼瘦臉等供應商,讓客戶能夠隨時快速接入和替換任意一家廠商。
3. 性能要好
雖然隨着時間的推移,手機的性能愈來愈強大,可是 CPU 居高不下、發熱厲害、內存消耗大、運行速度慢的 App 終究仍是會失去不少寶貴的用戶。
SDK 如何作到更好的性能呢 ?其實就一條:充分地利用 GPU,盡一切可能減小 CPU 消耗?
- 音視頻編解碼儘量地使用
硬編/硬解
- 視頻/圖像的處理,儘量使用
OpenGL
,包括:美顏、濾鏡、水印、剪裁、旋轉等等
- 儘量更高效地編寫 OpenGL 代碼,使用一些提升性能的特性,包括:VBO, VAO, FBO, PBO 等等
- 動態管理 so,沒有用到的不加載;動態管理內存,
使用時再分配
- 合併處理流程,各類音視頻特效和處理,依次記錄狀態,待保存的時候,再調用算法處理
4. UI 和 SDK 邏輯要完全的分離
優秀的 SDK,必定要儘量避免把 UI 的界面和邏輯包含進去,否則 SDK 的使用者,很難知足產品經理的 UI 和交互設計要求,作出差別化的效果。
那麼,SDK 如何作到與 UI 邏輯完全地分離呢 ?
須要充分分解每個短視頻的功能需求,搞清楚每個需求的實現原理,哪部分是 UI 的,哪部分是核心的,前者寫到 DEMO 上,然後者則寫入 SDK 裏面。
就拿短視頻剪輯這個功能點來舉個例子,下圖所示是短視頻的一個熱點功能,對短視頻截取中間某一段片斷。
仔細思考這個功能點,其實關鍵點在於:
1. 獲取視頻中的連續圖像在列表中進行展現
2. 繪製左右遊標,以肯定剪輯的起始和結束的時間點
3. 讀取視頻文件,丟棄時間區間之外的視頻幀,保留剩餘視頻幀
屬於 UI 的部分:
1. 用列表顯示視頻幀圖像
2. 繪製左右遊標,支持手勢拖動
3. 根據視頻的總時長和遊標的位置,計算出起始和結束的時間點
屬於 SDK 的部分:
1. 提供視頻的時長
2. 提供視頻幀總數
3. 提供解碼後的每一幀視頻數據
4. 提供剪輯函數,參數爲:起始和結束的時間戳
5. 完成剪輯處理,輸出剪輯後的視頻文件
這樣分離好了以後,再去編寫 SDK 的接口和 UI 的 demo 代碼,就很是清晰了。
5. 穩定可靠,有更好的可支持性
優秀的 App 和 SDK,首先一點就是要穩定可靠,由於
沒有人會喜歡常常崩潰的程序
。不過,沒有人敢說本身的程序是完美的,不會有任何 BUG 的,可是,具有良好的可支持性的產品,每每更容易受到親賴。
什麼是可支持性 ?
舉個例子,就像家裏買的某些品牌的洗衣機或者空調,在出故障的時候,液晶屏幕上會打出一些錯誤碼,當你給售後打電話的時候,售後每每可以根據描述的信息以及錯誤代碼很快地定位到問題或者給出臨時的解決方案。
如何讓短視頻 SDK 具備更好的可支持性呢 ?關鍵在於一套健全而規範的日誌系統,能夠有效提升技術支持和開發者排查問題的速度和效率,那麼,設計這樣一套
完善的日誌系統,有哪些關鍵點呢 ?
- 支持配置 SDK 的輸出日誌級別,如:ERROR, WARN, INFO, DEBUG, VERBOSE
- SDK 初始化的時候輸出關鍵的排障信息,如:應用包名,SDK 版本,設備機型,系統 OS 版本,關鍵配置等
- 規範的日誌格式,如:<SDK TAG>:<Module TAG>:<Class TAG>:<Message>,能夠快速方便地過濾出各個模塊的運行狀態
- 健全的問題手冊/文檔,讓每個錯誤碼都有文檔可依,開發者能夠完成簡單初步的問題分析
6. 小結
總而言之,設計一款優秀而且口碑好的短視頻 SDK,並非簡簡單單堆積一些功能就夠了,其背後仍是要花費很多心血的。