Android FFmpeg 编译.so库

Android FFmpeg系列——0 编译.so库
Android FFmpeg系列——1 播放视频
Android FFmpeg系列——2 播放音频
Android FFmpeg系列——3 C多线程使用
Android FFmpeg系列——4 子线程播放音视频
Android FFmpeg系列——5 音视频同步播放
Android FFmpeg系列——6 Java 获取播放进度
Android FFmpeg系列——7 实现快进/快退功能

编译了好几天,算是把它搞出来了!!

环境准备

博主尝试在win7使用Cygwin编译,按照网上的说法,结果出现各种莫名其妙的错,比如 “找不到\r命令” 之类,大家可以尝试一下,反正我是怕了,所以博主决定在linux下编译。

编译环境:Linux(博主是在VMware搭建的Centos环境)

这里再做一下笔记,关于在VMware中window和linux文件共享的。

(1)安装好Linux后,关掉Linux,挂载darwin.iso

(2)开启Linux虚拟机,点击VMware菜单【虚拟机】–> 【安装VMware Tools】

此时VMWare下会出现一个浅黄色的提示,根据提示,点击【我已安装】按钮。

(3)在Linux安装vmware tools

  1. 在/mnt创建cdrom目录:

cd /mnt
mkdir cdrom

  1. 挂载CD

mount /dev/cdrom /mnt/cdrom

  1. 在/home创建个人目录,比如johan

cd /home
mkdir johan

  1. 将/mnt/cdrom下的VMwareTools-xxxx复制到个人目录中

cp /mnt/cdrom/VMwareTools-xxx /home/johan

  1. 解压VMwareTools

cd /home/johan
tar -zxvf VMwareTools-xxx

  1. 进入解压文件夹,安装vmware工具

cd vmware-tools-distrib
./vmware-install.pl

如果提示没有perl命令,使用yum install perl命令安装即可。

安装好VMwareTool之后,点击VMware菜单,【虚拟机】–> 【设置】,启动共享菜单

此时,我们可以在/mnt/hgfs下看到共享文件夹了

博主之前不小心用了window下的NDK,当然编译时不通过的,会报以下错:
arm-xxxx-gcc is unable to create an executable file.
C compiler test failed.
然后进入ffbuild,查看config.log,发现则直接是 “arm-xxxx-gcc, No such file or directory”
但是我设置的路径是正确
最后才发现我用的是window下的NDK

NDK:android-ndk-r13b-linux-x86_64.zip

博主之前编译的是版本4.x,不知道怎么配置config,虽然可以从help看出,但是博主还是想编个版本出来再说
之后我选了3.4.x,在编译过程中,报错:
./libavutil/timer.h:38:31: fatal error: linux/perf_event.h: No such file or directory
根据 http://www.ffmpeg-archive.org/ffmpeg-3-4-1-with-android-td4682624.html 这个反馈,改了之后,果然没有报错,但是限制了最低版本为Android-21,这不是我想要的,好像还有一种办法,说是注释掉

include ‘<‘linux/perf_event.h’>’

读者可以尝试

FFmpeg版本:ffmpeg-3.2.1.tar.gz

配置文件

在window下载好文件之后,通过共享文件夹,使用cp复制命令,把android-ndk-r13b-linux-x86_64.zip和ffmpeg-3.2.1.tar.gz复制到个人文件夹中(博主这里是/home/johan)。

然后使用tar命令解压这两个文件:

修改configure文件

修改这个文件,主要是为了修改so命名规则。

vim 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)'

提示:在vim中,可以使用/SLIBNAME_WITH_MAJOR查找对应位置

记得修改完后,退出键,输入:wq保存。

编写编译脚本

vim build_android.sh

输入以下内容:

#!/bin/bash
make clean
#填写你具体的ndk解压目录(改为自己的目录)
export NDK=/android/ndk/android-ndk-r13b
#定义android最低版本,必须低于目标手机使用版本
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
#编译后的文件会放置在 当前路径下的android/arm/下
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
#./configure 即为ffmpeg 根目录下的可执行文件configure
#你可以在ffmpeg根目录下使用./configure --hellp 查看 ./configure后可填入的参数。
./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_CFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

在linux中输入这么一段应该相当可怕,所以我在window新建一个文件build_android.sh,直接将内容复制进去,保存之后,通过共享文件复制到解压的ffmpeg文件中。

但是注意的是,我在window下创建文件,复制内容后,可能在linux下有特殊符号,可能会报 “没有找到\r命令”,所以保存的格式要改一下(博主用的是notepad++)。

编译.so库

先把build_android.sh添加可执行权限

chmod +x build_android.sh

执行build_android.sh脚本开始编译

./build_android.sh

没什么意外的话,10分钟左右编译完成,在ffmpeg文件夹下会多一个android文件夹,进入android文件夹下,就是我们编译出来的库文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值