如何编译ffmepg的动态链接库,可以看这里:https://www.jianshu.com/p/7dfd64f906e5。
1、新建项目,将编译好的ffmpeg库,拷贝到项目的libs文件夹中。
2、在src/main路径下,创建cpp文件夹,将编译好的头文件放到cpp文件夹下,并创建一个native-lib.cpp文件(暂时不需要在里面写代码)
3、创建CMakeLists.txt文件
并且在该文件内,添加和配置上面我们引入的库文件。
cmake_minimum_required(VERSION 3.4.1)
# # 定义LIBS_DIR
set(LIBS_DIR ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI})
# 添加头文件目录
include_directories(src/main/cpp/include/)
# 添加ffmpeg相关的so库
# 添加库——外部引入的库
# 库名称:avcodec(不需要包含前缀lib)
# 库类型:SHARED,表示动态库,后缀为.so(如果是STATIC,则表示静态库,后缀为.a)
# IMPORTED表明是外部引入的库
add_library( avcodec
SHARED
IMPORTED)
# 设置目标属性
# 设置avcodec目标库的IMPORTED_LOCATION属性,用于说明引入库的位置
# 还可以设置其他属性,格式:PROPERTIES key value
set_target_properties( avcodec
PROPERTIES IMPORTED_LOCATION
${LIBS_DIR}/libavcodec.so)
add_library( avfilter
SHARED
IMPORTED)
set_target_properties( avfilter
PROPERTIES IMPORTED_LOCATION
${LIBS_DIR}/libavfilter.so)
add_library( avformat
SHARED
IMPORTED)
set_target_properties( avformat
PROPERTIES IMPORTED_LOCATION
${LIBS_DIR}/libavformat.so)
add_library( avutil
SHARED
IMPORTED)
set_target_properties( avutil
PROPERTIES IMPORTED_LOCATION
${LIBS_DIR}/libavutil.so)
add_library( swresample
SHARED
IMPORTED)
set_target_properties( swresample
PROPERTIES IMPORTED_LOCATION
${LIBS_DIR}/libswresample.so)
add_library( swscale
SHARED
IMPORTED)
set_target_properties( swscale
PROPERTIES IMPORTED_LOCATION
${LIBS_DIR}/libswscale.so)
# 查找代码中使用到的系统库
find_library(
log-lib
log )
# 配置目标so库编译信息
add_library(
native-lib
SHARED
src/main/cpp/native-lib.cpp
)
# 指定编译目标库时,cmake要链接的库
target_link_libraries(
# 指定目标库,native-lib 是在上面 add_library 中配置的目标库
native-lib
# 4. 连接 FFmpeg 相关的库
avutil
swresample
avcodec
avfilter
swscale
avformat
# Links the target library to the log library
# included in the NDK.
${log-lib} )
4、在app的build.gradle中添加ffmepg的配置项。
android {
compileSdk 31
defaultConfig {
...省略...
//配置cmake编译选项和支持的CPU指令集
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions -Wno-deprecated-declarations"
}
ndk{
abiFilters "armeabi-v7a"
}
}
}
//配置CMakeLists.txt文件的路径
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
...省略...
}
5、在你需要使用的地方调用
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val tvName:TextView = findViewById(R.id.tvName)
tvName.text = getConfiguration()
}
private external fun ffmpegVersion():String
private external fun getConfiguration():String
companion object{
init {
System.loadLibrary("native-lib")
}
}
}
这里用简单的activity来举例,首先我们是在伴生对象里初始化“native-lib”,然后定义一个external方法,方法名随意,由于没有实现,所以会报错,但是只需要根据Androidstudio的提示,利用快捷键就能自动在native-lib.cpp文件中创建对应的方法,我们只需要做的,就是去该方法内,写我们需要的逻辑即可。
#include <jni.h>
#include <string>
#include <unistd.h>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavfilter/avfilter.h>
#include <libavcodec/jni.h>
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_cjy_ffmepgdemo_MainActivity_ffmpegVersion(JNIEnv *env, jobject thiz) {
const char *version = av_version_info();
return env->NewStringUTF(version);
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_cjy_ffmepgdemo_MainActivity_getConfiguration(JNIEnv *env, jobject thiz) {
return env->NewStringUTF(avcodec_configuration());
}
运行并且输出信息:
简单的使用流程就是这样,后续会继续记录,怎么结合这些库,来实现我们的播放功能。