在我這篇文章中有簡單的提供一個NDK交叉編譯FFmpeg玫锋,編譯完成之后的集成就比較容易了释涛。當然還是需要一點點jni開發(fā)的技術缰趋,不了解的可以去看看我的這兩篇文章:
集成
我認為在編譯好FFmpeg之后寺鸥,集成FFmpeg有以下幾步:
- 在Android Studio中創(chuàng)建支持c++的Android項目
- 添加FFmpeg的頭文件
- 添加FFmpeg的so文件
- 調用FFmpeg方法測試集成是否成功
內容不多蛤虐,下邊就開始操作媳谁。
創(chuàng)建支持c++項目
這步其實對做過Android開發(fā)的同學毫無難度涂滴。
- new一個Android Project,然后自定義一下名字和包名晴音,然后在
include C++ support
一項前打勾柔纵; - 然后next,然后是選擇要開發(fā)的目標設備和最低版本锤躁,這里以手機為例搁料,最低版本一般要全兼容就選4.0,不是太嚴苛的話可以選擇4.1了(4.1以上目前占99.6%)系羞;
- 然后next加缘,默認選擇的Empty Activity就行;
- 然后next觉啊,默認的名字就行拣宏,也可以自己修改也行;
- 然后next杠人,這里是選擇c++支持勋乾,我們選擇c++11就好了;
- 最后finish嗡善,等待編譯完成就完成了這一步辑莫。
添加FFmpeg的頭文件
編譯好之后,項目文件結構換成Project罩引,個人習慣各吨,因為這樣目錄結構比較清晰。
- 將之前編譯好的FFmpeg的頭文件目錄拷貝到app目錄下袁铐;
- 再在app下的CMakeLists.txt文件中揭蜒,添加
include_directories(include)
代碼横浑; - 這樣頭文件就算是加進來了。
添加FFmpeg的so文件
在libs目錄下添加你編譯出來的FFmpeg的cpu目錄屉更,例如我添加的是armeabi-v7a;然后就把之前編譯出來的所有so包放到新添加的cpu目錄下徙融;然后在app模塊的build.gradle文件的android->defaultConfig下邊添加:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
表示jni的資源路徑是在libs目錄下的;然后再到app下的CMakeLists.txt文件中添加:
#設置ffmpeg庫路徑變量
set(FF ${CMAKE_CURRENT_SOURCE_DIR}/libs/${ANDROID_ABI})
add_library(avcodec SHARED IMPORTED)
add_library(avformat SHARED IMPORTED)
add_library(avutil SHARED IMPORTED)
add_library(swscale SHARED IMPORTED)
add_library(swresample SHARED IMPORTED)
set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${FF}/libavcodec.so)
set_target_properties(avformat PROPERTIES IMPORTED_LOCATION ${FF}/libavformat.so)
set_target_properties(avutil PROPERTIES IMPORTED_LOCATION ${FF}/libavutil.so)
set_target_properties(swscale PROPERTIES IMPORTED_LOCATION ${FF}/libswscale.so)
set_target_properties(swresample PROPERTIES IMPORTED_LOCATION ${FF}/libswresample.so)
再把心添加的庫文件鏈接到native-lib下瑰谜,也就是將如下代碼:
target_link_libraries(
native-lib
${log-lib})
改成
target_link_libraries(
native-lib
avcodec avformat avutil swscale swresample
${log-lib})
這樣到這里添加so文件也就完成了欺冀。主要是CMakeLists.txt文件修改比較多,修改完之后這個文件的內容如下萨脑,可以對比一下(我已經把不太需要的注釋刪了):
cmake_minimum_required(VERSION 3.4.1)
#添加頭文件路徑
include_directories(include)
#設置ffmpeg庫路徑變量
set(FF ${CMAKE_CURRENT_SOURCE_DIR}/libs/${ANDROID_ABI})
add_library(avcodec SHARED IMPORTED)
add_library(avformat SHARED IMPORTED)
add_library(avutil SHARED IMPORTED)
add_library(swscale SHARED IMPORTED)
add_library(swresample SHARED IMPORTED)
set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${FF}/libavcodec.so)
set_target_properties(avformat PROPERTIES IMPORTED_LOCATION ${FF}/libavformat.so)
set_target_properties(avutil PROPERTIES IMPORTED_LOCATION ${FF}/libavutil.so)
set_target_properties(swscale PROPERTIES IMPORTED_LOCATION ${FF}/libswscale.so)
set_target_properties(swresample PROPERTIES IMPORTED_LOCATION ${FF}/libswresample.so)
add_library(native-lib
SHARED
src/main/cpp/native-lib.cpp)
find_library(log-lib log)
target_link_libraries(
native-lib
avcodec avformat avutil swscale swresample
${log-lib})
調用FFmpeg方法測試是否集成成功
so添加完隐轩,再編譯一下之后;就可以在native-lib.cpp文件中的stringFromJNI方法里添加一句:
hello += avformat_configuration();
這時候這個方法是找不到的渤早,然后我們再引入頭文件:
extern "C" {
#include <libavformat/avformat.h>
}
extern "c"這一個是表示這部分按照c語言的規(guī)則來編譯职车,至于為什么要這樣可以自行查詢。
這樣不出意外蛛芥,運行程序就能在屏幕中看到很長一串文本提鸟,包含的是ffmpeg編譯的配置信息和腳本的./configure 之后的那部分有點類似。
到這里FFmpeg的集成就基本完成了仅淑。