学习和记录如何在项目中使用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()
}
}
★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。
见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓