Android NDK开发之旅27 NDK Linux下FFmpeg编译

###前言linux

咱们进行Android FFmpeg开发的时候,须要一些FFmpeg预编译的库,这些预编译的so库须要在Linux环境下编译。android

###Linux下FFmpeg编译shell

因为笔者公司的电脑是Ubuntu14.04系统,所以咱们直接使用Ubuntu系统进行编译。读者也能够本身搭建Linux虚拟机或者购买云服务器。vim

####关于云服务器的购买bash

  1. 买阿里云主机 最好是Ubuntu系统的。其中阿里云的华北一核1GB最便宜。
  2. 咱们须要安装XShell客户端(内含XFTP)来对服务器进行操做、文件传输。经过公网地址进行链接便可。
  3. 为了方便操做,直接使用root用户便可,可是通常咱们都是须要建立用户的。

####1、准备NDK服务器

编译FFmpeg的时候须要用到NDK。微信

在Linux环境中,咱们须要有一个NDK的压缩包,例如:架构

android-ndk-r10e-linux-x86_64.bin
复制代码

而后执行下面的命令进行解压缩便可(注意权限问题):ide

./android-ndk-r10e-linux-x86_64.bin
复制代码

####2、配置NDK环境变量ui

环境变量配置

vim ~/.bashrc(~表明当前用户)
复制代码

编辑:

export NDKROOT=你的NDK根目录
export PATH=$NDKROOT:$PATH
复制代码

更新(否则的话就须要重启命令行)

source ~/.bashrc
复制代码

####3、准备FFmpeg

咱们须要去FFmpeg官网下载FFmpeg的Linux源码,版本不须要太新:

ffmpeg-2.6.9.zip
复制代码

而后执行解压缩命令:

uzip ffmpeg-2.6.9.zip
复制代码

####4、编写shell脚本

咱们须要编写shell脚本传参调用ffmpeg-2.6.9下的configure脚本,进行编译,咱们写的shell脚本以下,build_android.sh:

#!/bin/bash
make clean
export NDK=/home/wuhuannan/Android/Sdk/ndk-bundle
export SYSROOT=$NDK/platforms/android-14/arch-arm/
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-yasm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--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
复制代码

指定NDK的一些路径,配置CPU架构类型,PREFIX是指定动态库输出的路径,而后disable一些不须要的库(可减少输出的动态库的大小)等等。enable-shared是生成共享库的意思。

注意:

  1. 换行的时候须要有\,主要不要有额外的空格。
  2. 统一转为UTF-8无BOM格式。能够经过note pad++进行转码,这样子Windows和LInux都通用了。也能够经过dos2unix命令进行转码。或者先由Linux建立文件再由Windows编辑。
  3. NDK尽可能不要使用太新的版本,通常使用Android-9便可。新版本会有一些坑,好比LOG2的问题。

####5、修改configure文件

ffmpeg-2.6.9根目录下有个configure文件,这个文件比较重要。咱们本身写的脚本文件就是依据这个文件来写的。

经过这个文件咱们能够看到FFmpeg库之间的依赖关系,例如:

avcodec_example_deps="avcodec avutil"
复制代码

一些编译指令。

这里咱们须要修改一下输出的动态库的命名规则:

#注释的部分
#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)'
复制代码

####6、执行脚本文件

咱们须要把咱们本身写的build_android.sh放到ffmpeg-2.6.9根目录下,而后授予权限,执行:

./build_android.sh开始编译
复制代码

编译过程当中会临时先自动生成c.mak文件,头文件等。编译大概几分钟时间。

####7、最终编译输出的动态库文件以下:

输出的动态库文件

这些库咱们就能够直接放到Android Studio工程中使用了。

若是以为个人文字对你有所帮助的话,欢迎关注个人公众号:

公众号:Android开发进阶

个人群欢迎你们进来探讨各类技术与非技术的话题,有兴趣的朋友们加我私人微信huannan88,我拉你进群交(♂)流(♀)

相关文章
相关标签/搜索