学习和记录如何在项目中运用FFmpeg

经过穿插编译生成FFmpeg动态库之后,就是导入到项目中。这儿咱们导入到现有项目的步骤。

1、创立Android Library

Android项目导入FFmpeg
在创立了ffmpeg Library库,右击ffmpeg组件,弹出下面弹框,挑选 Add C++ to Module,防止手动创立相关文件麻烦。

Android项目导入FFmpeg
会主动在目录新增下面文件。

Android项目导入FFmpeg

2、仿制FFmpeg

咱们将穿插编译生成的so文件仿制到libs目录下,和头文件所在文件夹仿制到cpp目录下。

2.1 仿制方针so文件

咱们将穿插编译生成的ffmpeg的7个so文件仿制到libs目录下。

Android项目导入FFmpeg
方针文件夹,如图所示:

Android项目导入FFmpeg

将头文件仿制到cpp目录下。

Android项目导入FFmpeg

方针文件如图所示:

Android项目导入FFmpeg

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

Android项目导入FFmpeg
榜首部分能够直接仿制导入,装备资源。

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的版别号,来判断是否装备成功。

Android项目导入FFmpeg
在kotlin文件下调用JNI,咱们新建了一个FFmpegJni的object目标,并界说了getVersion办法,留意关键字是external不是native.经过Android Studio的提示,咱们能够便利的在ffmpeg.cpp文件下生成对应办法。

Android项目导入FFmpeg
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…