学习和记录如何在项目中运用FFmpeg。
经过穿插编译生成FFmpeg动态库之后,就是导入到项目中。这儿咱们导入到现有项目的步骤。
1、创立Android Library
在创立了ffmpeg Library
库,右击ffmpeg
组件,弹出下面弹框,挑选 Add C++ to Module
,防止手动创立相关文件麻烦。
会主动在目录新增下面文件。
2、仿制FFmpeg
咱们将穿插编译生成的so文件仿制到libs目录下,和头文件所在文件夹仿制到cpp目录下。
2.1 仿制方针so文件
咱们将穿插编译生成的ffmpeg的7个so文件仿制到libs目录下。
方针文件夹,如图所示:
将头文件仿制到cpp目录下。
方针文件如图所示:
3、装备相关文件
3.1 装备build.gradle
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags ''
abiFilters "arm64-v8a"
}
}
ndk { //过滤CPU abi arm64-v8a
abiFilters "arm64-v8a"
}
}
externalNativeBuild { //主动生成
cmake {
path file('src/main/cpp/CMakeLists.txt')
version '3.22.1'
}
}
sourceSets { //新增
main {
// 指定jni库的存放目录为libs
jniLibs.srcDirs = ['libs']
}
}
}
3.2 装备CMakeList.txt
榜首部分能够直接仿制导入,装备资源。
include_directories("${CMAKE_SOURCE_DIR}/include")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}../../../../libs/${ANDROID_ABI}")
第二部分连接到方针ffmpeg的so库,假如填写,但资源不存在,会报错。
target_link_libraries( # Specifies the target library.
ffmpeg
avcodec
avdevice
avfilter
avformat
avutil
swresample
swscale
# Links the target library to the log library
# included in the NDK.
${log-lib})
4、查看装备结果
经过获取FFmpeg的版别号,来判断是否装备成功。
在kotlin文件下调用JNI,咱们新建了一个FFmpegJni的object目标,并界说了getVersion
办法,留意关键字是external
不是native
.经过Android Studio的提示,咱们能够便利的在ffmpeg.cpp文件下生成对应办法。
av_version_info()
函数是avcodec.so
的办法,咱们先引进其头文件libavcodec/avcodec.h
就能够引用了。
#include <jni.h>
#include <string>
extern "C" {
#include "libavcodec/avcodec.h"
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_xxm_ffmpeg_FFmpegJni_getVersion(JNIEnv *env, jobject thiz) {
return env->NewStringUTF(av_version_info());
}
5、加载ffmpeg
这儿为了便利,咱们再抽离出FFmpegManager
类,这儿调用相关办法,System.loadLibrary
也会被初始化。然后activity
调用getFFmpegVersion
函数,不出意外,就能够获得对应的FFmpege
版别
class FFmpegManager {
init {
System.loadLibrary("ffmpeg")
}
fun getFFmpegVersion():String{
return FFmpegJni.getVersion()
}
}
源码地址:gitee.com/zhangws_ohu…