深度解析!短視頻如何成為現象級產品


歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐干貨哦~

本文由 BestSDK 團隊發布在騰訊雲+社區

2016 年中國移動短視頻用戶數為 1.5 億,今年預計會達到 2.4 億,增長率高達 58.2%,可見短視頻的熱度在一直提升;近幾年,短視頻的生產模式在不斷演進,從 UGC 到 PGC,再到最新的 MCN,內容的產能和質量均得到了巨大提升。

短視頻發展史

​圖 1

 

圖 1 所示是短視頻及直播的發展史,眾所周知,2016 年是直播元年,在這期間誕生了很多直播平台,比如熊貓、映客、斗魚等;而在 2017 年,短視頻的火爆程度並不亞於直播,可能大家都以為短視頻是從 2017 年開始火爆起來的,但其實早在 2015 年就已經誕生出快手、秒拍、美拍等短視頻 App。

​圖 2

 

圖 2 所示是短視頻在各個行業的綜合應用。

研發短視頻 App 的難點

前面介紹完有關短視頻的歷史以及發展趨勢,下面着重介紹一下關於短視頻開發需要的預備知識及難點:

  • 1、音視頻領域固有門檻

深刻理解音視頻編碼格式 H.264 和 AAC 的編碼細節;混音時如何將兩個音頻調整到一致的參數,使用什么樣的算法去混合等等。

  • 2、圖形圖像、OpenGL 處理

攝像頭預覽數據,圖像處理,音視頻編解碼都需要了解 RGB 和 YUV 色彩空間的數據格式,以及它們之間轉換的方式等等。

  • 3、平台相關

要對相應平台的攝像頭、麥克風、編解碼、多媒體處理等 API 十分熟悉,否則它們的一些坑會耗費你大量時間。

  • 4、高級功能

視頻編輯少不了特色和高級的功能,例如美顏,濾鏡,MV 特效,倍數拍攝,文字特效等,每一個高級功能都對各方面技術提出很高的要求。

  • 5、系統版本,機型等兼容性問題

這算是一個老生常談的問題,無論 iOS 還是 Android,機型和系統版本都越來越多了,必然會帶來兼容性問題。比如會有小部分 Android 機型編碼的視頻在 iOS 端播放不了的情況,類似這種兼容性問題都是需要進行解決的。

  • 6、性能以及資源占用的優化

移動應用的計算資源受到相應系統的嚴格制約,在進行音視頻采集,渲染,編碼等復雜計算的同時,還要確保應用有足夠的資源流暢運行,這要求開發人員有豐富的調優能力。

短視頻 SDK 架構設計

接下來介紹一下我們團隊在進行短視頻 SDK 實踐中主要做的一些事情,這其中最重要的就是短視頻 SDK 的架構設計,包括架構設計理念、架構圖、整體數據流程、模塊架構設計等。

  • 1、SDK 架構設計理念

​圖 3

說到 SDK 的設計理念必定要提到命名規范,就跟七牛的企業理念「簡單.可信賴」一樣,我們的命名規范是統一、簡單並且精煉的,比如我們將對外的核心類統一以 PLShortVideo 為前綴,如圖 3 所示分別是錄制、編輯以及剪輯等模塊的命名;參數配置類則均以 PLxxxSetting 為標准進行命名(圖 4);接口回調類則均以 PLxxxListener 為標准命名。

​圖 4

第二點我們遵循的是高模塊化、模塊可插拔的一個理念;高模塊化必須要保證每個類每個方法都「名副其實」並「各司其職」,這樣才能編寫更清晰的邏輯;高模塊化同時可以促進高復用,減少重復代碼;圖 5 所示是 SDK 內的轉碼核心類,因為編輯、剪輯在最后保存的時候都需要一個解碼並重新編碼的過程,在這里,轉碼核心類可以達到一個高復用。

​圖 5

 

圖 6​

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

​圖 7

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

接着是擴展性這一塊,我們遵循高擴展,開放性的理念。在錄制以及編輯過程中,都會有數據的回調並支持第三方庫進行美顏,濾鏡,貼紙,特效等功能。

  • 2、短視頻SDK架構

圖 8​

 

圖 8 所示為 Android 短視頻 SDK 的架構圖,可以划分為四層。第一層為應用層;第二層為 SDK 對外的接口層;第三層為核心層,主要是內部的一些模塊;第四層主要是 Android 系統層。

​圖 9

圖 9 所示是整體數據流程圖;輸入模塊支持通過兩種方式采集數據,一種是通過攝像頭和麥克風采集數據,采集到的數據可以進行數據處理,另一種則是通過文件導入並進行解碼處理;編輯模塊有着十分豐富的功能比如添加字幕、MV 特效、添加背景音樂等等;編碼模塊主要支持 H.264 軟編/硬編以及 ACC 軟編/硬編。下面將着重就幾個模塊進行介紹。

​圖 10

圖 10 為錄制模塊的示意圖。錄制模塊的重點在於幀數據獲取,除了可以通過攝像頭獲取視頻幀,還可以通過屏幕錄制獲取視頻幀,而音頻幀數據主要還是通過麥克風進行獲取;虛線部分的 Filter 模塊主要實現了內置美顏/濾鏡功能,另外因為有紋理和 YUV 數據的 CallBack 回調機制,所以也支持第三方庫的美顏、濾鏡、特效等功能;處理后的數據會經過 OpenGL 進行裁剪,縮放,旋轉等操作,這些工作雖然可以由 CPU 來進行,但是會比較耗時,利用 GPU 是更明智的選擇。

​圖 11

圖 11 所示為編輯模塊的示意圖。首先需要導入一個視頻文件,解包之后會得到相應的幀數據,接着分別通過音視頻解碼器得到 PCM 和紋理,然后把它們送進編輯引擎,在這里面可以進行各種各樣的處理數據經過編輯之后,與錄制相同會分兩路,其中一路進行播放渲染,另一路會進行轉碼保存。

​圖 12

圖 12 所示是 MV 特效的實現思路。通過攝像頭采集的數據無需解碼,而 MV 視頻文件的幀數據則需要解碼后才可以進行處理。SurfaceTexture 的主要作用是將解碼后的數據幀進行回調通知你可以在 OpenGL 線程中更新紋理了,這個通知可以是多線程同時進行的操作,所以在幀回調時一定要對其進行上鎖,防止出現 MV 畫面之間不同步的問題。

圖 13​

圖 13 為日志系統的模塊圖。日志系統主要是為了方便排障,快速定位問題以及調試問題,我們會將 SDK 版本、設備機型、系統版本,關鍵配置等一一進行輸出,以方便用戶根據這些信息進行排障。當然,研發過程不可能一帆風順,總要踩過一些坑才能使整個 SDK 更加完善。下面就列舉一些我們踩過的坑以及排查的過程。

部分視頻剪輯出現花屏

 

我們通過對客戶提供的一些樣本視頻進行分析后,發現出問題的都是帶有雙向引用 B 幀的 High profile 視頻,如圖 14 所示,B 幀(3)位於中間,其引用左右兩邊的 P 幀(2、4)在顯示時是這樣的順序,但是在進行幀存儲以及視頻解碼時,B 幀(3)是在這 2 個 P 幀其后的。

最后給大家分享一句話,也算是對自己的一個鼓勵,就是「Fake it until you make it」。對於我們客戶端團隊,要將 SDK 打磨到最完美的狀態我們進行了很多嘗試,也歷經了很多血淚,最后才有今天的成果,我們需要努力的地方也還有很多,也會再接再厲,謝謝大家!

 

問答

短視頻的發展前景以及未來發展方向?

更多與短視頻相關的精華問答,盡在騰訊雲+社區!

相關閱讀

快手為何能成為現象級產品?還原2017年最火短視頻背后的商業邏輯

開發手游和視頻直播,這幾款SDK必備

數據告訴你,抖音是怎么在半年之內逆襲的

 

此文已由作者授權騰訊雲+社區發布,轉載請注明文章出處

 

原文鏈接:https://cloud.tencent.com/developer/article/1049278

 海量技術實踐經驗,盡在雲加社區! https://cloud.tencent.com/developer

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM