ffmpeg自定义 android,将ffmpeg集成到Android工程中

准备工具

Android开发工具AS(需要下载NDK)

ffmpeg交叉编译后的动态库或静态库以及头文件

如果你不知道如何编译ffmpeg请看这篇文章

NDKr20使用clang编译ffmpeg4.2.2

接入步骤

新建Native C++工程并引入头文件和动态库:

344f9ea9d7c3

项目代码目录

编写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的动态库以来进来

avformat

avcodec

avutil

avfilter

swscale

swresample

# NDK中的log库

log )

相关注释都已经写的很清楚了,这里就不再多解析了。ffmpeg就引入进去后,下面我编写一个简答的代码调用一下ffmpeg的相关api测试下是否能正常调用。

新建一个native方法获取ffmpeg的版本号:

public native static String getFFmpegVersion();

jni相关代码:

#include

#include

// 因为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显示一下获取到的版本号:

344f9ea9d7c3

成功获取到ffmpeg版本号

遇到的问题

报错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"

}

}

最后如果你对音视频开发感兴趣可扫码关注,后续我们共同探讨,共同进步。

344f9ea9d7c3

image

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值