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
- 在/mnt创建cdrom目录:
cd /mnt
mkdir cdrom
- 挂载CD
mount /dev/cdrom /mnt/cdrom
- 在/home创建个人目录,比如johan
cd /home
mkdir johan
- 将/mnt/cdrom下的VMwareTools-xxxx复制到个人目录中
cp /mnt/cdrom/VMwareTools-xxx /home/johan
- 解压VMwareTools
cd /home/johan
tar -zxvf VMwareTools-xxx
- 进入解压文件夹,安装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文件夹下,就是我们编译出来的库文件。