美文网首页
Mac平台编译FFmpeg for Android

Mac平台编译FFmpeg for Android

作者: 天天_盖世英雄 | 来源:发表于2018-04-03 10:24 被阅读1098次

其实网络上有很多关于编译FFmpeg的文档,但是真正到自己编译的时候还是会遇到一些意想不到的问题。原因可能是平台不一样,也可能是FFmpeg版本不一样导致别人的方法照搬过来不能work。那我下面就分享一下自己编译FFmpeg的过程:

一、工作环境

FFmpeg version:    3.4.2

编译平台:                MacOS

NDK version:          15.2.4203891

二、准备工作

1. 下载FFmpeg源码:http://ffmpeg.org

2. 修改源码目录下的配置文件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)'

这一步是为了生成的so可以被Android平台识别,直接复制粘贴就可以。

三、写编译脚本

1. 指定临时目录 

export TMPDIR=/Users/Tian/Downloads/ffmpeg_install

指定一个临时目录,可以是任何路径,但必须保证存在,ffmpeg编译要用;

2. 指定NDK路径 

NDK=/Users/Tian/Library/Android/sdk/ndk-bundle

3. 指定使用NDK Platform版本 

SYSROOT=$NDK/platforms/android-16/arch-arm/ 

这里指定的ndk platform的路径,一定要选择比你的目标机器使用的版本低的,比如你的手机是android-15版本,那么就选择低于15的

4.指定编译工具链 

TOOLCHAIN=/Users/Tian/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

注意:这里很多博客里面最后一个目录都是linux-x86_64,如果用这个编译的话会报错:C compiler test failed,如果你也有这个问题可以检查有没有对应的目录。

5.指定编译后的安装目录 

PREFIX=/Users/Tian/Downloads/ffmpeg_install/

这个目录是ffmpeg编译后的so的输出目录,会有一个include和lib文件夹生成在这里,这也是我们之后要在android apk中使用的。

下面是我的脚本:

#!/bin/bash

export TMPDIR=/Users/Tian/Downloads

NDK=/Users/Tian/Library/Android/sdk/ndk-bundle

SYSROOT=$NDK/platforms/android-16/arch-arm/

TOOLCHAIN=/Users/Tian/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

CPU=arm

PREFIX=/Users/Tian/Downloads/ffmpeg_install/

ADDI_CFLAGS="-marm"

function build_one

{

./configure \

--prefix=$PREFIX \

--enable-shared \

--disable-static \

--disable-doc \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-ffserver \

--disable-doc \

--disable-symver \

--enable-small \

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

--target-os=linux \

--arch=arm \

--enable-cross-compile \

--sysroot=$SYSROOT \

--extra-cflags="-Os -fpic $ADDI_CFLAGS" \

--extra-ldflags="$ADDI_LDFLAGS" \

$ADDITIONAL_CONFIGURE_FLAG

make clean

make

make install

}

build_one

四、运行脚本

首先要给脚本文件添加执行权限,然后运行。

这里我会报错:fatal error: linux/perf_event.h: No such file or directory,发现是libavutil/timer.h 找不到 linux/perf_event.h 引起的。查了一下linux/perf_event.h是linux平台的效能优化工具,看起来没什么用,整段注掉,编译通过。(有知道的朋友可以交流一下这个具体是什么东西)

当脚本在没有任何报错的情况下跑完,就可以去之前设置的目录里面看成果了。打开你*.sh文件里指定的放编译结果的目录, $PREFIX 目录下生成 include和lib两个文件夹,将lib文件夹中的 pkgconfig 目录和so的链接文件删除,只保留so文件,然后include 和lib两个目录拷贝出来这就是我们想要的了。

以上就是我的整个编译过程,谢谢。

相关文章

网友评论

      本文标题:Mac平台编译FFmpeg for Android

      本文链接:https://www.haomeiwen.com/subject/fpfnkttx.html