**
Android studio集成FFmpeg
**
FFmpeg集成有以下几步
1.在Android studio中创建Native C++项目
2.添加FFmpeg的头文件
3.添加FFmpeg的so文件
4.调用FFmpeg方法测试集成是否成功
Android studio中创建项目
创建一个新项目 在Create new Project界面的Phone and Tablet中选择最后一个Native C++项目
next后自定义项目名称和包名语言选择kotlin
finish即可创建好项目
添加FFmpeg的头文件
编译好之后,项目文件结构换成Project,这样目录结构比较清晰。
将之前编译好的FFmpeg的头文件目录(include整个目录)拷贝到app目录下;
这样头文件就算是加进来了。
添加FFmpeg的so文件
在libs目录下添加你编译出来的FFmpeg的cpu目录,例如我添加的是armeabi-v7a;然后就把之前编译出来的所有so包放到新添加的cpu目录下;然后在app模块的build.gradle文件的android->defaultConfig下边添加:
defaultConfig {
ndk{ abiFilters 'armeabi-v7a'}//此处要和你编译的处理器版本号一致
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
表示jni的资源路径是在libs目录下的;然后再到app下的CMakeLists.txt文件中添加:
set(FF ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs)
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}/${ANDROID_ABI}/libavcodec.so)
set_target_properties(avformat PROPERTIES IMPORTED_LOCATION ${FF}/${ANDROID_ABI}/libavformat.so)
set_target_properties(avutil PROPERTIES IMPORTED_LOCATION ${FF}/${ANDROID_ABI}/libavutil.so)
set_target_properties(swscale PROPERTIES IMPORTED_LOCATION ${FF}/${ANDROID_ABI}/libswscale.so)
set_target_properties(swresample PROPERTIES IMPORTED_LOCATION ${FF}/${ANDROID_ABI}/libswresample.so)
target_include_directories(native-lib PRIVATE
../../../include)
再把心添加的库文件链接到native-lib下,也就是将如下代码:
target_link_libraries(
native-lib
${log-lib})
改成:
target_link_libraries(
native-lib
avcodec avformat avutil swscale swresample
${log-lib})
这样到这里添加so文件也就完成了。
调用FFmpeg的函数测试是否集成成功
so添加完,再编译一下之后;就可以在native-lib.cpp文件中的stringFromJNI方法里添加一句:
hello += std::to_string(avutil_version());
并添加头文件
extern "C" {
#include "libavutil/avutil.h"
}
extern "c"这一个是表示这部分按照c语言的规则来编译,至于为什么要这样可以自行查询。
这样不出意外,运行程序就能在屏幕中看到很长一串文本,包含的是ffmpeg编译的配置信息和脚本的./configure 之后的那部分有点类似。
到这里FFmpeg的集成就基本完成了。
注意:
这里有个坑大家注意一下,运行的时候可能会出现以下问题
遇见这个问题就在app目录下的build.gradle中的android项下添加
// 项目中依赖的第三方库越来越多时,有可能会出现两个依赖库中存在同一个(名称)文件 如果这样,Gradle在打包时就会提示错误(警告)。那么就可以根据提示,然后使用以下方法将重复的文件剔除
packagingOptions {
// pickFirsts:当出现重复文件,会使用第一个匹配的文件打包进入apk
pickFirst 'lib/armeabi-v7a/libavformat.so'
pickFirst 'lib/armeabi-v7a/libavcodec.so'
pickFirst 'lib/armeabi-v7a/libavfilter.so'
pickFirst 'lib/armeabi-v7a/libswscale.so'
pickFirst 'lib/armeabi-v7a/libswresample.so'
pickFirst 'lib/armeabi-v7a/libavutil.so'
}
如果在开发板中无可视化界面,可以用以下命令输出调用包所显示的信息
#include <android/log.h>
#define TAG "FaceSDKNative"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
LOGD("********************LOG:%s***********************",hello.c_str());
例如我的代码和运行结果
#include <jni.h>
#include <string>
#include <android/log.h>
#define TAG "FaceSDKNative"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
extern "C"
{
#include "libavutil/avutil.h"
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication1_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
hello += std::to_string(avutil_version());
LOGD("********************LOG:%s***********************",hello.c_str());
return env->NewStringUTF(hello.c_str());
}
运行结果
文章参考视频播放器之Android Studio集成FFmpeg
如有侵权,请联系作者删除