本文主要是介绍将ffmepg引入到Android工程中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
准备工具
- Android开发工具AS(需要下载NDK)
- ffmpeg交叉编译后的动态库或静态库以及头文件
如果你不知道如何编译ffmpeg请看这篇文章
NDKr20使用clang编译ffmpeg4.2.2
接入步骤
新建Native C++工程并引入头文件和动态库:
编写CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.4.1)# 引入FFmpeg的头文件
include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)# 方式一
# 引入FFmpeg的库文件,设置内部的方式引入,指定库的目录是 -L 指定具体的库-l
# 这种方式方便快捷
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}")# 方式二
#设置ffmpeg库所在路径的变量
#set(FF ${CMAKE_SOURCE_DIR}/${CMAKE_ANDROID_ARCH_ABI})
#add_library(avcodec SHARED IMPORTED)
#set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${FF}/libavcodec.so)
#
#add_library(avformat SHARED IMPORTED)
#set_target_properties(avformat PROPERTIES IMPORTED_LOCATION ${FF}/libavformat.so)
#
#add_library(avutil SHARED IMPORTED)
#set_target_properties(avutil PROPERTIES IMPORTED_LOCATION ${FF}/libavutil.so)
#
#add_library(swscale SHARED IMPORTED)
#set_target_properties(swscale PROPERTIES IMPORTED_LOCATION ${FF}/libswscale.so)
#
#add_library(swresample SHARED IMPORTED)
#set_target_properties(swresample PROPERTIES IMPORTED_LOCATION ${FF}/libswresample.so)
#
#add_library(avfilter SHARED IMPORTED)
#set_target_properties(avfilter PROPERTIES IMPORTED_LOCATION ${FF}/libavfilter.so)#找到包含所有的cpp文件
file(GLOB allCpp src/main/cpp/*.*)add_library(# 生成的库的名字flyffmpeg-lib# 动态库SHARED# 源文件${allCpp} )target_link_libraries( #目标库flyffmpeg-lib# 把ffmpeg的动态库以来进来avformatavcodecavutilavfilterswscaleswresample# NDK中的log库log )
相关注释都已经写的很清楚了,这里就不再多解析了。ffmpeg就引入进去后,下面我编写一个简答的代码调用一下ffmpeg的相关api测试下是否能正常调用。
新建一个native方法获取ffmpeg的版本号:
public native static String getFFmpegVersion();
jni相关代码:
#include <jni.h>
#include <string>// 因为ffmpeg是纯C代码,要在cpp中使用则需要使用 extern "C"
extern "C" {
#include "libavutil/avutil.h"
}extern "C"
JNIEXPORT jstring JNICALL
Java_com_flyer_ffmpeg_FFmpegUtils_getFFmpegVersion(JNIEnv *env, jclass clazz) {//通过av_version_info()获取版本号return env -> NewStringUTF(av_version_info());
}
通过TextView显示一下获取到的版本号:
遇到的问题
- 报错ffmpeg的相关库没有找到
解决方法:检查你项目的CMakeLists.txt
中的ffmpeg相关库有没有正确链接;
检查build.gradle
中有没有配置好将相关so打包进去apk的配置:
sourceSets {main {//将依赖库打进apk,否则可能出现找不到库jniLibs.srcDirs = ['libs']}}
- 报自定义封装的so库找不到
解决方法: 检查build.gradle
中是否设置了abiFilters
笔者的环境实验发现在cmake中设置abiFilters无效,依然会报so无法找到的错误,但是在ndk中设置则正常;
externalNativeBuild(){cmake{// 为什么在这里指定编译架构会报so库找不到的错误,而在ndk中指定则不会???// abiFilters "armeabi-v7a" //指定编译为 armeabi-v7a}ndk {abiFilters "armeabi-v7a"}}
最后如果你对音视频开发感兴趣可扫码关注,后续我们共同探讨,共同进步。
这篇关于将ffmepg引入到Android工程中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!