1. 程式人生 > >FFmpeg:建立支援FFmpeg的AS專案

FFmpeg:建立支援FFmpeg的AS專案

一.新建Android Studio專案

注意點:

1.在“Create Android Project”欄目時,須勾選“Include C++ support” 複選框;

2.在“Customize C++ Support 欄目”時,C++ Standard 選擇下拉列表中的“C++11”。

 

二.在AS專案中配置支援FFmpeg

注意點:

1.新增FFmpeg依賴庫。包括生成的標頭檔案和.so檔案。

1.1)  將編譯FFmpeg生成的include目錄拷貝到專案的app目錄下。

1.2) 將編譯FFmpeg生成的lib目錄拷貝到專案的libs目錄下。

PS:這裡需要區分不同的CPU平臺,如果FFmpeg生成的庫是針對armeabi-v7a的,則放到libs下的armeabi-v7a目錄,針對x86的,則放到x86目錄下。

2.配置FFmpeg庫的環境變數。主要用於告訴CMake FFmpeg標頭檔案的路徑,庫檔案的路徑,以及編譯連結的內容。

2.1) 宣告標頭檔案及用到的庫檔案路徑。開啟app目錄下的 CMakeLists.txt ,在原有內容基礎上新增下列程式碼:

#新增標頭檔案路徑
include_directories(include)

#設定FFmpeg庫所在路徑
set(FF ${CMAKE_CURRENT_SOURCE_DIR}
/libs/${ANDROID_ABI}) add_library(avcodec SHARED IMPORTED) set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${FF}/libavcodec.so)

 include_directories(include) 用於宣告標頭檔案的路徑,我們這裡是在include目錄下。

 add_library 則用於宣告庫檔案的路徑,這裡的 add_library 不僅可用於新增原始碼型別的庫(如.cpp檔案),也可以新增編譯好的so庫(我們這裡使用的是libavcodec.so這個庫)。這裡的 avcodec

 並不是so庫的檔名,僅是一個簡寫的庫名。後面的 set_target_properties 中須指定庫檔案所在的詳細路徑,與常用的Android.mk檔案不同,這裡需要寫全字首(lib)和字尾(.so)。

2.2) 連結指定的so庫。找到CMakeLists.txt中的 target_link_libraries 項,在原有的 native-lib 後新增上面用的庫名: avcodec 

這段程式碼是讓CMake能夠連結指定的so庫,否則即使包含標頭檔案,在編譯時也會報函式undefined的錯誤。(將所有用到的庫全部連結到一個庫當中,這樣做的好處是在java中只需要引入一個native-lib庫就行了)

3.宣告專案庫檔案路徑

開啟app目錄下的build.gradle檔案,在defalutConfig大括號下新增下列程式碼:

        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
            }
            ndk {
                abiFilters "armeabi-v7a"
            }
        }
        sourceSets {
            main {
                jniLibs.srcDirs=['libs']
            }
        }    

這裡的  abiFilters 用於告訴編譯器我們只加載armv7a的版本, jniLibs.srcDirs 則指定我們的庫檔案是放在libs目錄下。

4.呼叫函式測試FFmpeg是否可以正常工作

開啟cpp目錄下的 native-lib.cpp 檔案中,在檔案頂部新增下列程式碼:

extern "C" {
#include <libavcodec/avcodec.h>
}

修改stringFromJNI()函式

編譯執行,如果程式顯示下面型別的內容,則說明FFmpeg已經配置並載入成功了。