android 使用 ffmpeg 进行视频转码(二)
16lz
2022-01-06
经过 上一篇博客的步骤后,生成了八个带版本号的 .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.cppadd_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)# 设置根目录变量 DIRset(DIR ../../../../libs)# 这一句和 下面的 set_target_properties 这一句表示,# 将 armeabi 目录下的 libavcodec-56.so 导入为 avcodec-56 库,并且在项目中引用# 下面的七组功能类似。 注意:add_library 中的 avcodec-56 命名 需要与 .so 库的命名一致# 去掉前缀 lib 和后缀 .soadd_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 #include #include // 告诉编译器按照 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();
最终效果如下:
最后,运行项目,并生成 APK,如果没有报错,则表示引用 ffmpeg 库到 android 项目成功了
更多相关文章
- 《Android经验分享》周刊第7期
- Android(安卓)NDK开发之旅(2):Android(安卓)Studio中使用CMake进
- Android(安卓)NDK 简介
- Android(安卓)NDK
- Visual Studio 跨平台開發實戰(4) - Xamarin Android(安卓)基本
- 通过ant脚本,编译打包android工程
- 面向 Android(安卓)的 Google 项目:Google API
- Hello World Kotlin
- 进入android项目组的第一天