android 使用 ffmpeg 进行视频转码(二)

经过 上一篇博客的步骤后,生成了八个带版本号的 .so 库,接下来进行导入 NDK 项目的操作

第一步:用 Android Studio 新建 FFmpegDemo 项目,注意勾选 include c++ support 选项

这里写图片描述
这里写图片描述

项目创建完成后,在 libs/ 下新建 armeabi/inlcude/目录,并将上一篇博客中生成的 android/arm/include 目录下的文件放入 include 目录,android/arm/lib 下的带版本号的 .so 文件放入 armeabi/目录,如下所示:

这里写图片描述

第二步:修改 CMakeLists.txt 文件的内容如下:

# 指定 cmake 最小版本
cmake_minimum_required(VERSION 3.4.1)

# 最终生成的共享库命名为:native-lib,源文件路径在 src/main/cpp/native-lib.cpp
add_library( native-lib
             SHARED
             src/main/cpp/native-lib.cpp )

# 寻找 log 库,然后赋值给 log-lib,用于在 NDK 开发中输出 Log 信息
find_library(log-lib log)

# 指定 include 头文件所在路径
include_directories(libs/include)

# 设置根目录变量 DIR
set(DIR ../../../../libs)

# 这一句和 下面的 set_target_properties 这一句表示,
# 将 armeabi 目录下的 libavcodec-56.so 导入为 avcodec-56 库,并且在项目中引用
# 下面的七组功能类似。 注意:add_library 中的 avcodec-56 命名 需要与 .so 库的命名一致
# 去掉前缀 lib 和后缀 .so
add_library( avcodec-56
             SHARED
             IMPORTED )

set_target_properties( avcodec-56
                       PROPERTIES IMPORTED_LOCATION
                       ${DIR}/armeabi/libavcodec-56.so
                     )

#
add_library( avdevice-56
             SHARED
             IMPORTED )

set_target_properties( avdevice-56
                       PROPERTIES IMPORTED_LOCATION
                       ${DIR}/armeabi/libavdevice-56.so
                     )

#
add_library( avfilter-5
             SHARED
             IMPORTED )

set_target_properties( avfilter-5
                       PROPERTIES IMPORTED_LOCATION
                       ${DIR}/armeabi/libavfilter-5.so
                     )

#
add_library( avformat-56
             SHARED
             IMPORTED )

set_target_properties( avformat-56
                       PROPERTIES IMPORTED_LOCATION
                       ${DIR}/armeabi/libavformat-56.so
                     )


#
add_library( avutil-54
             SHARED
             IMPORTED )

set_target_properties( avutil-54
                       PROPERTIES IMPORTED_LOCATION
                       ${DIR}/armeabi/libavutil-54.so
                     )

#
add_library( postproc-53
             SHARED
             IMPORTED )

set_target_properties( postproc-53
                       PROPERTIES IMPORTED_LOCATION
                       ${DIR}/armeabi/libpostproc-53.so
                     )

#
add_library( swresample-1
             SHARED
             IMPORTED )

set_target_properties( swresample-1
                       PROPERTIES IMPORTED_LOCATION
                       ${DIR}/armeabi/libswresample-1.so
                     )

#
add_library( swscale-3
             SHARED
             IMPORTED )

set_target_properties( swscale-3
                       PROPERTIES IMPORTED_LOCATION
                       ${DIR}/armeabi/libswscale-3.so
                     )

# 最终生成 native-lib 库,以及生成所依赖的其他的库
target_link_libraries( native-lib
                       avcodec-56
                       avdevice-56
                       avfilter-5
                       avformat-56
                       avutil-54
                       postproc-53
                       swresample-1
                       swscale-3
                       ${log-lib}
                        )

第三步:在 MainActivity 中加载 .so 库

这里写图片描述

注意:native-lib 需要写在最下面

第四步:修改 app module 下的 build.gradle 文件

在 android.defaultConfig 下,添加如下内容:

这里写图片描述

指定 abi 架构 为 armeabi,以及指定 jniLibs 所在目录

第四步:在 native-lib.cpp 中添加如下头文件引用

#include <jni.h>
#include <string>
#include <android/log.h>

// 告诉编译器按照 C 的规则去编译函数
extern "C" {
//编码
#include "libavcodec/avcodec.h"
//封装格式处理
#include "libavformat/avformat.h"
//像素处理
#include "libswscale/swscale.h"
}
#define LOGI(FORMAT, ...) __android_log_print(ANDROID_LOG_INFO,"jason",FORMAT,##__VA_ARGS__);
#define LOGE(FORMAT, ...) __android_log_print(ANDROID_LOG_ERROR,"jason",FORMAT,##__VA_ARGS__);

最后在 stringFromJNI 方法中添加两个函数:

LOGE("测试 log");
av_register_all();

最终效果如下:

扫描二维码关注公众号,回复: 2632802 查看本文章

这里写图片描述

最后,运行项目,并生成 APK,如果没有报错,则表示引用 ffmpeg 库到 android 项目成功了

PS:以上博文内容根据 动脑学院 Android 课程内容整理而成,如有侵权,请通知

猜你喜欢

转载自blog.csdn.net/liangjiu2009/article/details/78427496