從零開始仿寫一個抖音App——跨平臺影片編輯SDK專案搭建

fondtiger發表於2021-09-09

不知不覺已經到了2019年,本系列的文章也更新到了8篇。很慶幸筆者能堅持下來,從我司的程式碼中學習到了很多東西。當然更慶幸的是收穫了眾多讀者的鼓勵和支援。從本篇文章開始,我們將接觸短影片 app 中比較核心的功能——影片編輯,筆者在我司的日常工作中,也經常對這個模組進行開發,可以說對這部分功能比較熟悉了。所以最近的幾篇文章,我會從零開始完善一個影片編輯 sdk 的各種功能,最後整合到我們之前的 MyTiktok 專案中。注:本文以 android 平臺為例子,ios 因為不會,所以暫時不涉及。

本文分為以下章節,讀者可按需閱讀:

  • 1.專案建立——新建一個跨平臺影片編輯專案

  • 2.基礎 lib 整合——將 ffmpeg、protobuf 這些必須使用的三方庫整合到專案中

  • 3.基礎資料結構——定義和講解一些影片編輯流程中需要使用到的資料結構

一、專案建立

1.方法論

我想看本文的人有很大一部分都是 android 工程師,所以在講乾貨之前,我需要講一講方法論

  • 1.當我們在使用 IDE 開發 App 的時候,我們在幹什麼?

    • 1.建立一個資料夾,模仿 AS 生成的專案,向資料夾裡面加檔案

    • 2.在 gradle 檔案中新增依賴庫,然後寫程式碼。使用命令列來 sync gradle。

    • 3.命令列執行 gradle 來打包 APK,執行 App

    • 1.首先我們會使用 AS 來新建一個專案,專案會有很多可選的引數。

    • 2.在專案的 gradle 檔案中新增依賴庫,然後寫程式碼

    • 3.打包成 APK,執行 App

    • 1.Android 工程師平時使用 Android Studio 來開發 App,ios 工程師使用 XCode。那麼我們平時在使用 IDE 的時候,我們到底在幹什麼呢?

    • 2.這裡我以 Android 來舉例子:

    • 3.上面就是我們平時開發的流程了,那麼我們能不使用 IDE 來開發一個 App 嗎?理論上來說是可以的,有下面這些步驟。

    • 4.其實我們不需要 AS 就能進行 Android 開發(當然沒有人那麼傻)。我們需要的只是一個專案管理的工具——gradle。放在不同的開發者那裡,只是專案管理的工具不同:寫 java 的用 maven、寫 python 的用 conda/pip、寫前端的用 npm、寫 c/c++ 的用 CMake。

    • 5.所以當一個專案中既要寫 c++ 又要寫 android 還要寫 ios 的時候,我們只需要三個專案管理工具就行了,IDE 對我們來說只是一個檔案編輯器+檔案搜尋器+檔案瀏覽器。

    • 6.以上就是我作為一個 android 工程師,在使用了各種不同語言構建不同專案之後思維上的轉變。當你能看清和思考一個東西的本質的時候你能走的更遠。

2.專案搭建

那麼廢話不多說,就開始搭建我們的專案吧注意:目前 已經上傳到了 github 上面了,建議結合專案食用,

  • 1.首先我們新建一個資料夾,然後進入資料夾中。在其中建立下面這些東西,如圖1。裡面的東西我一個個來講解

    • 1.首先 LICENSSE 和 README.md 就不用說了。

    • 2.android:下面是一個完整的 android 工程,android 工程的內部也會引用到外部的檔案,這個後面再說。

    • 3.ios:下會是一個完整的 ios 工程,當然我目前還不會 ios,所以先略過

    • 4.buildtools:裡面會存放一些專案執行時的指令碼,比如我們在 中用到的編譯 FFmpeg 的指令碼等等

    • 5.docs:內部存放一些專案文件

    • 6.sharedcode:裡面存放 android 和 ios 共享的程式碼,如 c/c++ 程式碼等等,還有就是 protobuf 生成的程式碼。

    • 7.sharedproto:裡面存放 android、ios、c++ 三端共享的 protobuf 程式碼,可以使用 buildtools 裡面的指令碼一鍵生成三端的程式碼

    • 8.third_part:可以以 git submodule 的形式,引用其他的三方庫的原始碼與 android 和 ios 專案一起編譯,目前是空的。

圖片描述

圖1:根目錄

  • 2.介紹好了專案構成,我們開始配置 android 專案吧。

    • 1.首先 externalNativeBuild.cmake 裡面配置了一些引數,這裡只要知道我們使用的是 c++11 就好了

    • 2.externalNativeBuild.ndk 裡面我們只生成一種 so 檔案就是 armeabi,本來是應該使用 arm64-v8a,這樣才是最佳適配,現在就先湊合著用吧

    • 3.再看外面的 externalNativeBuild.cmake,這裡設定了 CMake 的路徑,注意這裡是以當前 gradle 檔案為初始路徑的。


    • 1.多了 jni.editorsdk 目錄,這個目錄用來存放 jni 檔案,相當於是 c/c++ 和 java 的中間層。

    • 2.然後是 CMakeLists.txt 檔案,其用於管理 android 專案需要引入的 c/c++ 程式碼。

    • 1.首先,我們需要使用 AS 來建立一個支援 C++ 的工程,注意目錄需要選在上面提到的 android 目錄下面。

    • 2.建立好了之後,我們需要建立一個 android library 作為影片編輯 sdk 的載體。這個 module 將會整合所有的,共享 cpp 程式碼、.so 檔案、.a 檔案,然後透過 java 程式碼被外部呼叫。在專案中我將這個 module 命名為了 mttvideoeditorsdk

    • 3.至於 app module 可以引用 mttvideoeditorsdk module 便於平時除錯 sdk。

    • 4.我們再來看 mttvideoeditorsdk 的結構如圖2,其實比較簡單

    • 5.我們再來看看 gradle 檔案是怎麼配置的如圖3。

圖片描述

圖2:mttvideoeditorsdk目錄

圖片描述

圖3:mttvideoeditorsdk的gradle檔案

二、基礎 lib 整合

上面講了如何搭建專案,這一章就來講講如何整合一些基礎庫吧。

首先我們都知道,在 android 中我們可以使用 gradle 向遠端中央倉庫拉取我們需要的庫。像 java 的 maven、js 的 npm、ios 的 pods都有這個能力。但是在 c/c++ 上的專案管理工具 CMake 就沒有這個能力,它只能在本地搜尋和整合你已經安裝好的庫或者原始碼,而且 c/c++ 又不具有跨平臺能力。所以最終就導致了我們如果想使用 ffmpeg、protobuf 這樣大型的開源專案都需要自己去 clone 原始碼然後自己編譯出不同平臺的庫。

1.FFmpeg 整合

  • 1.說到 FFmpeg 的整合,其實我在,已經提到過一些了。我這裡就簡單講講。

  • 2.首先我們需要編譯 FFmpeg 的程式碼獲取 so 庫和 標頭檔案,我的專案與上次不同,現在已經能編譯出一個單獨的 libffmpeg.so 的檔案了,大家可以之前拿過來用。

  • 3.然後我們在 android 專案下面新建一個目錄用來儲存這些東西,如圖4。

  • 4.最後我們看程式碼塊1,這裡都有註釋比較簡單,就是將 libffmpeg.so 和他的標頭檔案連結到整個專案中

圖片描述



作者:何時夕
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2508/viewspace-2821544/,如需轉載,請註明出處,否則將追究法律責任。

相關文章