ffmpeg 移植安卓

首先思路是,在liunx环境下,用ndk交叉编译工具,生产可以在android平台里调用的.so库动态库文件.

因为andriod平台的cpu架构不一致,所有用ndk编译时需要指定目标android平台,我的手机是华为4x,ABI是armv7-a的,查看自己手机的ABI,可以看http://blog.csdn.net/watermusicyes/article/details/45059309,

如果附件无法现在,请复制链接到其他浏览器试试,我这里谷歌可以,火狐不行,

build4android.sh 脚本最好下载到ununtu下编辑,网页上的每行后面会有几个不可见字符,所有不能执行

得到so文件和头文件后,在eclipse,通过jni调用动态库,所以还需要windows的ndk,有的eclipse没有ndk插件这里有链接https://pan.baidu.com/s/1gfeZaev


可以先看这篇视频热热身https://v.qq.com/x/page/s03208w5ewp.html

1.安装VMware Workstation Pro

2.安装ubuntu-16.04.3-desktop-amd64.iso

3.创建root用户,之后再root用户下操作比较好,创建root用户可看下面链接

创建root用户

4.在ubuntu上安装ssh服务,之后传文件方便,

1)ubuntu安装ssh服务器
sudo apt-get install openssh-server
2)出现问题时,重启ssh服务即可
sudo service ssh restart
启动完成之后可以使用命令:ps –e | grep ssh 来查看ssh状态、

5.用Xshell 登录root用户时被拒绝,可以看下面链接

6.安装ndk

用Xftp 把 android-ndk-r13-linux-x86_64.zip 上传到ubuntu上,最好上传到系统目录下,我的是/usr/dev/ndk,不要上传到/home下
然后解压zip文件
解压
unzip android-ndk-r13-linux-x86_64.zip
解压后目录是这样的

7.配置ndk环境变量,看参考一下

8.选择ffmpeg版本,最新版本会编译移植失败,比如下面链接中的第二个问题,不知道怎么解决

当我使用3.1.3进行移植时,编译通过了,下面给出下载地址

 下载完成后,上传到ubuntu中,我的路径是 /usr/dev/ffmpeg/ffmpeg3.1.3,上传完成后,可以解压到相同目录

解压命令

tar zxvf FFmpeg-n3.1.3.tar.gz
解压完成后,目录是这样的

并且需要修改ffmpeg根目录的configure文件

在虚拟机中按ctrl+alt+T ,打开终端,

然后cd 进入ffmpeg根目录,

用gedit 编辑configure文件

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

9.编写编译脚本

  脚本不能在windows中编写上传到ubuntu中执行,可能是因为有不可见字符,我会把我的脚本上传,下载后不要在windows中打开,上传到ubuntu中编辑

 下载脚本

https://pan.baidu.com/s/1c1KM3TY

脚本内容

#!/bin/bash
export TMPDIR=/usr/dev/ffmpeg/ffmpeg3.1.3New/FFmpeg-n3.1.3/ffmpegtemp #这句很重要,不然会报错 unable to create temporary file in

# NDK的路径,根据自己的安装位置进行设置
NDK=/usr/dev/ndk/android-ndk-r13

# 编译针对的平台,可以根据自己的需求进行设置
# 这里选择最低支持android-14, arm架构,生成的so库是放在
# libs/armeabi文件夹下的,若针对x86架构,要选择arch-x86
PLATFORM=$NDK/platforms/android-14/arch-arm

# 工具链的路径,根据编译的平台不同而不同
# arm-linux-androideabi-4.9与上面设置的PLATFORM对应,4.9为工具的版本号,
# 根据自己安装的NDK版本来确定,一般使用最新的版本
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

function build_one
{
./configure \
    --prefix=$PREFIX \
    --target-os=linux \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --arch=arm \
    --sysroot=$PLATFORM \
    --extra-cflags="-I$PLATFORM/usr/include" \
    --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
    --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
    --enable-shared \
    --enable-runtime-cpudetect \
    --enable-gpl \
    --enable-small \
    --enable-cross-compile \
    --disable-debug \
    --disable-static \
    --disable-doc \
    --disable-asm \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-postproc \
    --disable-avdevice \
    --disable-symver \
    --disable-stripping \

$ADDITIONAL_CONFIGURE_FLAG
sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h
sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h

make clean
make -j4
make install

}

# arm v7vfp
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
PREFIX=./android/$CPU-vfp
ADDITIONAL_CONFIGURE_FLAG=
build_one

# CPU=armv
# PREFIX=$(pwd)/android/$CPU
# ADDI_CFLAGS="-marm"
# build_one

#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7vfpv3
# CPU=armv7-a
# OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
# PREFIX=./android/$CPU
# ADDITIONAL_CONFIGURE_FLAG=
# build_one

#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one

#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one



其中configure命令的各种参数,可以在下面链接中查得

ffmpeg编译选项汇总 - CSDN博客

给脚本可执行权限,要用cd命令进入脚本所在路径

chmod 777 build4android.sh

10.0安装 yasm ,移植中需要,也可以通过禁用命令不使用yasm,但是安装也很方便,就按了吧

sudo apt-get install build-essential git pkg-config yasm  

10.1可能还需要安装ubuntu的32位支持库,我是按这里安装的

http://blog.csdn.net/bfboys/article/details/53013662

11.先在ffmpeg根目录下执行

./configure
如果没有问题,在执行刚才编写的脚本

./build4android.sh
如果没有问题,经过10多分钟的编译,

会在ffmpeg根目录下生成android/arm的文件夹


其中include是头文件,lib中是.so库文件

这次编译的结果我也上传到百度云盘了,亲们可以下载测试


https://pan.baidu.com/s/1eS2HFiE


12.在头文件和库文件复制到android工程中.就可以通过jni调用了,测试这次编译成果在下次在分享吧




猜你喜欢

转载自blog.csdn.net/qq_31683775/article/details/78824331
今日推荐