简介
学习FFmpeg避免不了要学习。ffmpeg和ffmprobe两个核心的可执行程序,而应用在移动端必不可少的需要编译成Android可以使用的so库。本文主要介绍在mac上的FFmpeg的编译
分为两部分
- 编译为mac环境
- 编译为Android so库
1 FFmpeg编译为mac环境
如果没有安装yasm的话,会报
FFmpeg yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild
1.1.1 下载YASM
1.1.2 进入yasm目录
//第一步
cd ~/yasm-1.3.0
//第二步 配置
./configure
//第三步 编译
make
//第四步 安装
sudo make install
至此 YASM安装完毕
安装SDL
1.2.1 进入sdl目录
//第一步
cd ~/SDL2-2.0.8
//第二步
./configure
//第三步 编译
make -j 16
//第四步
sudo make install
1.3. 安装FFmpeg
去官方找个想要的版本
1.3.1 安装过程
//第一步 进入下载目录
$ cd ~/ffmpeg
//第二步 配置
//这里很关键,需要根据不同的配置来进行生产不同的ffmpeg
./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --enable-shared --disable-static
第三步 编译
make -j 4
第四步 安装
sudo make install
1.3.2 配置环境变量
//第一步
vi ~/.bash_profile
//第二步
export PATH="$PATH:/usr/local/ffmpeg/bin"
//第三步
source ~/.bash_profile
命令行 ffmpeg 成功
2. 编译成android 库
2.1 官网下载ffmpeg
我下载的4.1版本
2.2 下载NDK
不能使用Android studio 的NDK 。我用的17r
2.3 添加脚本
在ffmpeg解压后的根目录下 新建一个android_build.sh 文件
修改ndk和输出目录就好
#!/bin/bash
ADDI_CFLAGS="-marm"
API=19
PLATFORM=arm-linux-androideabi
CPU=x86_64 # 'armeabi-v7a' 'x86_64'
NDK=/Users/yinzelin/ndk/android-ndk-r17c # 修改成自己本地的ndk路径。
SYSROOT=$NDK/platforms/android-$API/arch-arm/
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/$PLATFORM
TOOLCHAIN=$NDK/toolchains/$PLATFORM-4.9/prebuilt/darwin-x86_64
OUTPUT=/Users/yinzelin/ffmpeg/ProgramFiles #自己指定一个输出目录,用来放生成的文件的。
function build
{
echo "开始编译ffmpeg"
./configure \
--prefix=$OUTPUT \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=armeabi-v7a \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$ASM -isysroot $ISYSROOT -Os -fpic -marm" \
--extra-ldflags="-marm" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
# 这里是定义用几个CPU编译,我用4个,一般在5分钟之内编译完成
make -j4
make install
echo "编译结束!"
}
build
2.4 修改配置 为android
打开ffmpeg根目录 修改.configure文件
修改前
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)'
2.5 执行脚本
./build_android.sh
在输出目录结果