影子论坛

搜索
夜间模式◐

如何把FFmpeg4.0.2 编译成Android动态库?
[系统工具] · summer · 发布于 · 2020-07-11 · 662 次点击 · 复制地址

倔强青铜Ⅱ   summer  · 2020-07-11 18:18:45 · 显示全部楼层 · 阅读
最近因为要做一些视频流,处理视频流过程中需要用到FFmpeg的库,于是在休息时手动编译了FFmpeg,引入到Android项目里,方便做视频流使用。需要的步骤比较繁琐,下面为大家一一讲解。
配置ndk环境

    NDK下载:“wget https://dl.google.com/android/re ... 1b-linux-x86_64.zip” 直接在linux上进行下载,或者也可以在windows端下载后,再利用xftp上传到linux。
    unzip命令解压

unzip android-ndk-r21b-linux-x86_64.zip

    将ndk解压的文件copy到/usr/ndk/目录下(这个看个人想把ndk放在那里)

mv /home/jason/android-ndk-r21b  /usr/ndk

    配置ndk的环境变量
    vim编辑打开bashrc文件

vim ~/.bashrc

加入ndk的环境配置
export NDKROOT=/usr/ndk/android-ndk-r21b
export PATH=$NDKROOTPATH

如下图
10761725-29b6c62f0c436006.png
退出按ESC,然后再按Shift+;
最后输入wq 保存退出
使ndk环境变量生效
source ~/.bashrc

    检测NDK环境配置
    直接ndk-build,如下图:表示成功
10761725-23c8ee299f73ee80.png
FFmpeg的编译

FFmpeg的历史版本的官方地址http://ffmpeg.org/releases/

    下载FFmpeg: “wget https://www.ffmpeg.org/releases/ffmpeg-4.0.2.tar.gz” 或者windows下载后再利用xftp上传到linux上。
    解压

tar -xzf  ffmpeg-4.0.2.tar.gz

    修改解压后的文件夹ffmpeg-4.0.2中的configure,如果不修改,打出来的动态库就不是android工程识别的(.so)结尾的库文件,导入到工程无法使用
    替换前的源码:

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

替换后的代码:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

源码的位置:FFmpeg4.0.2是在3566行
10761725-da1a127dd9b200c6.png
    编写编译脚本
    创建脚本文件,并且授予可执行权限

touch build_android.sh
chmod 777 build_android.sh

编写编译脚本
#!/bin/bash
# 清空上次的编译
make clean
#你自己的NDK路径。
export NDK=/usr/ndk/android-ndk-r21b
# 设置你的android平台编译器的版本 这里采用Android4.0
export SYSROOT=$NDK/platforms/android-16/arch-arm/
#编译使用的toolchain
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
# 这个是输出的路径
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-x86asm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

最后记得保存后退出,否则码这么久白费功夫了。然后等待10-20分钟编译:./build_android.sh我们可以看到最终结果就是:多个android目录,有arm目录,arm目录下有生产的头文件和库文件,如下图所示:
10761725-4cd8023dc0dde64f.png


免责声明:
影子论坛所发布的一切内容仅限用于学习和研究目的,请勿用于商业或者非法用途,否则一切后果由用户自负。
请支持正版得到更好的正版服务。如有侵权请邮件与我们联系处理。Mail To:swatxhim@outlook.com

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表