Android引入ffmpeg编译后的so库

作者:超人TIGA
链接:https://www.jianshu.com/p/7e381edb146

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());
}

运行并且输出信息:

总结

简单的使用流程就是这样,后续会继续记录。相信大家现在对怎么结合这些库,来实现我们的播放功能已经有了比较深入的理解了。

这里我就分享一份资料,包含:Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。分享给大家,非常适合近期有面试和想在技术道路上继续精进的朋友。
在这里插入图片描述

如果你有需要的话,可以扫描下方二维码,免费获取Android学习PDF+架构视频+面试文档+源码笔记领取方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值