【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态库打包 | 头文件与函数库拷贝 | CMake 脚本配置 )
文章目錄
- I . FFMPEG 交叉編譯后的函數庫及頭文件
- II . FFMPEG 靜態庫打包動態庫 ( 僅做參考 )
- III . 創建 Android Studio 工程
- IV . FFMPEG 頭文件與靜態庫拷貝
- V . CMakeList.txt 配置 FFMPEG 頭文件 與 函數庫
- VI . C++ 代碼
- VII . 博客資源
I . FFMPEG 交叉編譯后的函數庫及頭文件
1 . 編譯 FFMPEG 函數庫 : 【Android FFMPEG 開發】FFMPEG 交叉編譯配置 ( 下載 | 配置腳本 | 輸出路徑 | 函數庫配置 | 程序配置 | 組件配置 | 編碼解碼配置 | 交叉編譯配置 | 最終腳本 )
編譯出的靜態庫在上面博客的資源文件中下載 ; 下面截圖中是在 Ubuntu 中交叉編譯出的 6 個靜態庫 , 共 86 MB ;
2 . 靜態庫大小說明 :
① 調試信息 : 編譯出的 6 個靜態庫有 86MB , 這是因為編譯時 , 將調試信息也包含在里面 , 方便進行調試 ;
② 打包大小 : 最終打包成 APK 之后 , 整個 APK 文件只有不到 10MB 大小 ,
II . FFMPEG 靜態庫打包動態庫 ( 僅做參考 )
靜態庫打包到動態庫中 ( 僅做參考 ) : 將上面 6 個靜態庫打包到 動態庫 中 ; 打包后的 libffmpeg.so 在博客資源中可下載 ;
① 設置 交叉編譯器 臨時環境變量 :
export CC=/root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
② 設置指定 頭文件和函數庫 的臨時環境變量 :
export C_FLAGS="--sysroot=/root/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
③ 打包靜態庫命令 :
$CC $C_FLAGS -shared -o libffmpeg.so -Wl,--whole-archive libavcodec.a libavformat.a libswresample.a libavfilter.a libavutil.a libswscale.a -Wl,--no-whole-archive
④ 打包過程 :
root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib# export CC=/root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib# export C_FLAGS="--sysroot=/root/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi" root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib# root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib# $CC $C_FLAGS -shared -o libffmpeg.so -Wl,--whole-archive libavcodec.a libavformat.a libswresample.a libavfilter.a libavutil.a libswscale.a -Wl,--no-whole-archive root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib# ls libavcodec.a libavfilter.a libavformat.a libavutil.a libffmpeg.so libswresample.a libswscale.a pkgconfig root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib# ll 總用量 129336 drwxr-xr-x 3 root root 4096 2月 19 22:30 ./ drwxr-xr-x 5 root root 4096 2月 18 22:19 ../ -rw-r--r-- 1 root root 60104544 2月 18 22:18 libavcodec.a -rw-r--r-- 1 root root 763728 2月 18 22:14 libavfilter.a -rw-r--r-- 1 root root 25221538 2月 18 22:15 libavformat.a -rw-r--r-- 1 root root 1609508 2月 18 22:19 libavutil.a -rwxr-xr-x 1 root root 41509960 2月 19 22:30 libffmpeg.so* -rw-r--r-- 1 root root 401316 2月 18 22:18 libswresample.a -rw-r--r-- 1 root root 2807636 2月 18 22:19 libswscale.a drwxr-xr-x 2 root root 4096 2月 18 22:19 pkgconfig/III . 創建 Android Studio 工程
創建 Android Studio 工程 : 創建一個 Native C++ 類型的 Android 工程 ; ( 這里就不墨跡基礎操作了 )
IV . FFMPEG 頭文件與靜態庫拷貝
頭文件與靜態庫文件拷貝 : 將生成的 include 和 lib 兩個目錄 , 拷貝到 app/src/main/cpp 目錄下 ;
動態庫拷貝到 jniLibs/armeabi-v7a 目錄下 , 靜態庫可以拷貝到任意位置使用 ;
V . CMakeList.txt 配置 FFMPEG 頭文件 與 函數庫
1 . 頭文件查找路徑設置 : 使用 include_directories 指定 FFMPEG 頭文件查找目錄 , CMAKE_SOURCE_DIR 指的是當前的文件地址 ;
# IV . 指定 FFMPEG 頭文件查找目錄 # CMAKE_SOURCE_DIR 指的是當前的文件地址 include_directories(${CMAKE_SOURCE_DIR}/include)2 . 函數庫設置 : 函數庫在 cpp/lib 中 , 這里使用 -L 參數指定函數庫查找路徑 ;
# V . 指定 FFMPEG 靜態庫 # CMAKE_CXX_FLAGS 表示會將 C++ 的參數傳給編譯器 # CMAKE_C_FLAGS 表示會將 C 參數傳給編譯器# 參數設置 : 傳遞 CMAKE_CXX_FLAGS C+= 參數給編譯器時 , 在 該參數后面指定庫的路徑 # CMAKE_SOURCE_DIR 指的是當前的文件地址 # -L 參數指定動態庫的查找路徑 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/lib")3 . 函數庫鏈接設置 : 注意這里要鏈接 FFMPEG 的 6 個靜態庫 , 不要遺漏 ;
# V . 鏈接函數庫 # 參數 1 : 本構建腳本要生成的動態庫目標 # 參數 2 ~ ... : 后面是之前預編譯的動態庫或靜態庫 , 或引入的動態庫 target_link_libraries(native-lib# FFMPEG 靜態庫avcodecavfilteravformatavutilswresampleswscale# 日志庫${log-lib})4 . 完整構建腳本 :
# I . 指定 CMake 最低版本 cmake_minimum_required(VERSION 3.4.1)# II . 設置函數庫編譯 add_library( # 參數 1 : 設置生成的動態庫名稱native-lib# 參數 2 : 設置生成的函數庫類型 : ① 靜態庫 STATIC ② 動態庫 SHAREDSHARED# 參數 3 : 配置要編譯的源文件native-lib.cpp)# III . 到預設的目錄查找 log 庫 , 將找到的路徑賦值給 log-lib # 這個路徑是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so # 不同的 Android 版本號 和 CPU 架構 需要到對應的目錄中查找 , 此處是 29 版本 32 位 ARM 架構的日志庫 # # 可以不配置 : # 可以不進行該配置, 直接在后面的 target_link_libraries 中鏈接 log 也不會出錯 find_library(log-liblog)# IV . 指定 FFMPEG 頭文件查找目錄 # CMAKE_SOURCE_DIR 指的是當前的文件地址 include_directories(${CMAKE_SOURCE_DIR}/include)# V . 指定 FFMPEG 靜態庫 # CMAKE_CXX_FLAGS 表示會將 C++ 的參數傳給編譯器 # CMAKE_C_FLAGS 表示會將 C 參數傳給編譯器# 參數設置 : 傳遞 CMAKE_CXX_FLAGS C+= 參數給編譯器時 , 在 該參數后面指定庫的路徑 # CMAKE_SOURCE_DIR 指的是當前的文件地址 # -L 參數指定動態庫的查找路徑 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/lib")# V . 鏈接函數庫 # 參數 1 : 本構建腳本要生成的動態庫目標 # 參數 2 ~ ... : 后面是之前預編譯的動態庫或靜態庫 , 或引入的動態庫 target_link_libraries(native-lib# FFMPEG 靜態庫avcodecavfilteravformatavutilswresampleswscale# 日志庫${log-lib})VI . C++ 代碼
1 . 引入頭文件 : 引入 libavcodec/avcodec.h 頭文件 , FFMPEG 是 C 開發的 , 在 C++ 中使用需要使用 extern “C” 進行兼容 ;
// 注意 FFMPEG 是 C 開發的 , 在 C++ 中使用需要使用 extern "C" 進行兼容 extern "C"{#include <libavcodec/avcodec.h> }2 . 獲取版本號方法 : 調用 av_version_info() 可以獲取到 FFMPEG 版本號 , 即 “4.0.2” , 將這個字符串傳輸到主界面顯示 ;
3 . 完整代碼 :
#include <jni.h> #include <string>// 注意 FFMPEG 是 C 開發的 , 在 C++ 中使用需要使用 extern "C" 進行兼容 extern "C"{#include <libavcodec/avcodec.h> }extern "C" JNIEXPORT jstring JNICALL Java_kim_hsl_ffmpeg_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */) {std::string hello = "Hello from C++";return env->NewStringUTF(av_version_info()); }4 . 執行結果 :
VII . 博客資源
博客相關資源 :
① CSDN 博客地址 : 【Android FFMPEG 開發】Android Studio 工程配置 FFMPEG ( 動態庫打包 | 頭文件與函數庫拷貝 | CMake 腳本配置 )
② 博客資源下載地址 : https://download.csdn.net/download/han1202012/12173019
③ 示例代碼 GitHub 地址 : https://github.com/han1202012/010_FFMPEG
總結
以上是生活随笔為你收集整理的【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态库打包 | 头文件与函数库拷贝 | CMake 脚本配置 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android FFMPEG 开发】F
- 下一篇: 【Kotlin】IntelliJ IDE