前言
近期需要用到FFmpeg的库,来做视频流的处理,今天尝试实现了一下,手动编译FFmpeg,然后引入到Android项目去使用。
配置ndk环境
- NDK下载:“wget https://dl.google.com/android/repository/android-ndk-r21b-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的环境配置
代码语言:javascript复制export NDKROOT=/usr/ndk/android-ndk-r21b
export PATH=$NDKROOT:$PATH
如下图
ndk的环境变量配置.png
退出按ESC,然后再按Shift ; 最后输入wq 保存退出 使ndk环境变量生效
代码语言:javascript复制source ~/.bashrc
- 检测NDK环境配置 直接ndk-build,如下图:表示成功
linux中检测ndk是否安装成功.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)'
替换后的代码:
代码语言:javascript复制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
- 编写编译脚本 创建脚本文件,并且授予可执行权限
touch build_android.sh
chmod 777 build_android.sh
编写编译脚本
代码语言:javascript复制#!/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
保存退出,开始编译:大概要一二十分钟
代码语言:javascript复制./build_android.sh
最终结果:可以看到多个android目录,里面有arm目录,arm目录下有生产的头文件和库文件
image.png