编程技术分享平台

网站首页 > 技术教程 正文

编译ffmpeg并集成到安卓工程中(ffmpeg编译成dll)

xnh888 2024-11-05 13:01:37 技术教程 36 ℃ 0 评论

一,下载资源并配置环境变量

1.配置ndk编译环境

具体操作参考:ndk交叉编译这篇博客

2.下载并解压ffmpeg

此处下载ffmpeg4.0.2这个版本其他版本不能保证成功,下载地址:http://www.ffmpeg.org/releases/

wget http://www.ffmpeg.org/releases/ffmpeg-4.0.2.tar.bz2
tar -xvf ffmpeg-4.0.2.tar.bz2

解压后可以看到下面的目录结构

二,编译ffmpeg

1.切换用户

切换到root用户下,并执行./configure检查配置(非root用户会存在权限问题而无法编译项目)

./configure

2.编写脚本

检查完毕后,编写脚本传参给 configure对项目进行交叉编译这里取名为android_build.sh

#!/bin/bash
#NDK目录所在位置
NDK_PATH=/home/administrator/android/ndk/tool/android-ndk-r17c
#编译产物目录路径
PREFIX=../output/arm
#编译工具链前缀,这里写死arm-linux-androideabi-4.9(目标机器是arm32位)此处也可提取出一个变量在外部控制
TOOLCHAIN=$NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
#传递给gcc的参数,从as的 externalNativeBuild/xxx/build.ninja参考过来,  反正下面的配置,可以压制警告的意思
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -O0 -fPIC"
INCLUDE=" -isystem $NDK_PATH/sources/android/support/include"
# 1.--prefix=$PREFIX 指定编译产物输出目录
# 2.--enable-small 优化大小 非常重要,必须优化才行的哦
# 3.--disable-programs 不编译ffmpeg程序(命令行工具),我们是需要获取静态、动态库
# 4.--disable-avdevice 关闭avdevice模块,此模块在android中无用
# 5.--disable-encoders 关闭所有编码器(播放不需要编码)
# 6.--disable-muxers 关闭所有复用器(封装器),不需要生成mp4这样的文件,所有关闭
# 7.--disable-filters 关闭所有滤镜
# 8.--enable-cross-compile 开启交叉编译(ffmpeg是跨平台的,注意:并不是所有库都有这么happy的选项)
# 9.--cross-prefix 看右边的值就知道是干嘛的,gcc的前缀..
# 10.disable-shared / enable-static 这个不写也可以,默认就是这样的,(代表关闭动态库,开启静态库)如果编译动态库就传enable-shared / disable-static
# 11.--sysroot 传递编译时用到的系统库所在的路径
# 12.--extra-cflags 会传给gcc的参数
# 13.--arch  --target-os 
./configure \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--disable-shared \
--enable-static \
--sysroot=$NDK_PATH/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS $INCLUDE" \
--extra-cflags="-isysroot $NDK_PATH/sysroot/" \
--arch=arm \
--target-os=android \
 
make clean
make install

3.执行脚本

sh android_build.sh

如果执行过程中,出现make notfound,表示系统没有安装make程序,执行apt install make即可解决

相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】

音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

三,集成静态库到安卓工程

1.新建安卓ndk工程

具体步骤可以参考:交叉编译安卓动态/静态链接库_交叉编译链接动态库_Hfengxiang的博客-CSDN博客

2.拷贝源文件到项目中

3.编写CMakeList.txt文件

cmake_minimum_required(VERSION 3.10.2)
project("ffmpeg_test")
#TODO 第一步,导入头文件
include_directories("include")
#TODO 第二步批量导入所有源文件
aux_source_directory("${CMAKE_SOURCE_DIR}" my_source_path)
#TODO 第三步 导入库文件 CMAKE_SOURCE_DIR=CMakeList.txt所在位置
#静态库的位置
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/${CMAKE_ANDROID_ARCH_ABI}")
#动态库的位置
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
 
add_library( # Sets the name of the library.
             native-lib
 
             # Sets the library as a shared library.
             SHARED
 
             # Provides a relative path to your source file(s).
             ${my_source_path} )
 
find_library( # Sets the name of the path variable.
              log-lib
              log )
 
target_link_libraries( # Specifies the target library.
                       native-lib
 
                       # Links the target library to the log library
                       # included in the NDK.
        #TODO 第四步 将ffmpeg相关的库链接到总库
                       ${log-lib}
                        avformat
                        avfilter
                        swscale
                        avcodec
                        avutil
        )

4.调用ffmpeg库的方法

5.效果展示

原文 编译ffmpeg并集成到安卓工程中_Hfengxiang的博客-CSDN博客

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表