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/bashmake 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_64export CPU=arm#编译后的文件会放置在 当前路径下的android/arm/下export PREFIX=$(pwd)/android/$CPUexport 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_FLAGmake cleanmakemake 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文件夹下,就是我们编译出来的库文件。

更多相关文章

  1. Eclipse在线安装ADT等Android插件连接不上的解决方案
  2. Android通话默认打开扬声器
  3. android 模拟器上查看shareperference文件内容
  4. apk、dex、odex梳理
  5. 使用Android(安卓)Studio创建OpenCV 4.1.0 项目
  6. Android(安卓)Studio使用技巧
  7. android下的读写权限
  8. window7 android-ndk-r10d 编译ffmpeg 3.4
  9. Android(安卓)Studio使用技巧系列教程(七)

随机推荐

  1. android使用socket使底层和framework通信
  2. Android中对Log日志文件的分析
  3. [Android] 如何制作手电筒程序
  4. Android(安卓)Animation学习笔记
  5. Android开发起步
  6. android默认系统日期、时间、时区更改
  7. Android(安卓)- Android(安卓)的消息机制
  8. Android(安卓)Layout文件的属性说明
  9. Windows Phone 7 不温不火学习之《ListBo
  10. Android(安卓)画图之Matrix(二)