专栏首页包子的书架FFmpeg4.0.2 编译成Android动态库

FFmpeg4.0.2 编译成Android动态库

前言

近期需要用到FFmpeg的库,来做视频流的处理,今天尝试实现了一下,手动编译FFmpeg,然后引入到Android项目去使用。

配置ndk环境

  1. NDK下载:“wget https://dl.google.com/android/repository/android-ndk-r21b-linux-x86_64.zip” 直接在linux上进行下载,或者也可以在windows端下载后,再利用xftp上传到linux。
  2. unzip命令解压
unzip android-ndk-r21b-linux-x86_64.zip
  1. 将ndk解压的文件copy到/usr/ndk/目录下(这个看个人想把ndk放在那里)
mv /home/jason/android-ndk-r21b  /usr/ndk
  1. 配置ndk的环境变量 vim编辑打开bashrc文件
vim ~/.bashrc

加入ndk的环境配置

export NDKROOT=/usr/ndk/android-ndk-r21b
export PATH=$NDKROOT:$PATH

如下图

ndk的环境变量配置.png

退出按ESC,然后再按Shift+; 最后输入wq 保存退出 使ndk环境变量生效

source ~/.bashrc
  1. 检测NDK环境配置 直接ndk-build,如下图:表示成功

linux中检测ndk是否安装成功.png

FFmpeg的编译

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

  1. 下载FFmpeg: “wget https://www.ffmpeg.org/releases/ffmpeg-4.0.2.tar.gz” 或者windows下载后再利用xftp上传到linux上。
  2. 解压
tar -xzf  ffmpeg-4.0.2.tar.gz
  1. 修改解压后的文件夹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行

源码的位置.png

  1. 编写编译脚本 创建脚本文件,并且授予可执行权限
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

保存退出,开始编译:大概要一二十分钟

./build_android.sh

最终结果:可以看到多个android目录,里面有arm目录,arm目录下有生产的头文件和库文件

image.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • FFmpeg4.0.2编译32位和64位动态库,并且引入到Android项目中

    近期刚好用到FFmpeg来处理视频编码,由于网上各种版本的so库大部分都32位的,所以打算自己来编译32位和64位的库,我之前有写编译32位的库https://...

    包子388321
  • AppBarLayout和CollapsingToolbarLayout的闲谈

    自从google的design出来之后,很多控件效果实现起来已经不需要再像以前那样写自定义控件了,最近有个需求是要到页面头部标题栏的折叠效果,因此,想想用Col...

    包子388321
  • 两个TextView,第二个不超过最右侧边距

    包子388321
  • Mybatis源码之StatementType

      在mybatis中StatementType的值决定了由什么对象来执行我们的SQL语句。本文来分析下在mybatis中具体是怎么处理的。

    用户4919348
  • php中json_encode

    在 ajax 横行的今天,json 顺理成章地成为了前后端交互一个极其重要的工具。对于 PHP 来说,通常使用 json_encode 方法将一个 PHP 组...

    闵开慧
  • 平衡二叉树 AVL树结构详解 [Java实现]--源码部分

    https://blog.csdn.net/zhang6622056/article/details/82698859

    纯洁的微笑
  • 50行Python代码,教你获取公众号全部文章

    小詹说:我们平时阅读公众号的文章会遇到一个问题——阅读历史文章体验不好。的确如此,小詹自己也这么认为。所以今天分享的是好朋友 Python3X 的一篇干货分享,...

    小小詹同学
  • 平衡二叉树 AVL树结构详解 [Java实现]

    https://blog.csdn.net/zhang6622056/article/details/82698859

    纯洁的微笑
  • 聊聊dubbo的ConfigChangeEvent

    dubbo-2.7.3/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/d...

    codecraft
  • 聊聊dubbo的ConfigChangeEvent

    dubbo-2.7.3/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/d...

    codecraft

扫码关注云+社区

领取腾讯云代金券