Mac 下为将ffmepg +x264移植到android中,解决libx264.so.148 库cannot find问题

本人最近在研究音频视频这一块,考虑到后期开发要加很多功能,决定使用ffmepg去做,看的网上的东西都是比较陈旧,新版的工具编译会存在不少问题,于是本人决定自己挖坑

本文采用的是ndk下编译,想采用CMAKE编译的参考文章CMAKE编译FFMEPG

首先下载源码,这个没什么好讲,ffmepg源码下载地址http://ffmpeg.org/download.html

x264下载地址:http://www.videolan.org/developers/x264.html(有墙,如下载不了的,一会我会上传一份到博客)


安装android  studio 和ndk,本文用的ndk 是ndk-r12d,版本较新,API版本是android 7.0,为以后版本适配解决后患

https://developer.android.com/ndk/downloads/index.html(ndk下载地址)

打开ffmepg源码根目录,将ffmepg源码的configure文件打开,因为android系统不能识别libxxxxx-.so.xx这样的so库,所以我们需要将配置文件修改下,将一下内容:

SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
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_VERSION='$(SLIBNAME).$(LIBVERSION)'
# SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'  
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
# SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
# SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
编译x264:

本文采用x264和ffmepg分开编译的形式,

在x264源码根目录下创建build.sh

其代码如下:

export ANDROID_NDK=/Users/wenxi/Library/Android/sdk/ndk-bundle#ndk目录根据你的安装目录

export TOOLCHAIN=../../fftoolchain #toolchain 安装目录

export SYSROOT=$TOOLCHAIN/sysroot/

export PLATFORM=$ANDROID_NDK/platforms/android-24/arch-arm

export PREFIX=../android-lib #编译结果的目录


#生成toolchain目录,这一段可以在第一次运行后注释掉

$ANDROID_NDK/build/tools/make-standalone-toolchain.sh \

--toolchain=arm-linux-androideabi-4.9 \

--platform=android-24 --install-dir=$TOOLCHAIN


#

./configure \

--prefix=$PREFIX \

--enable-static \

--enable-shared \

--enable-pic \

--disable-asm \

--disable-cli \

--host=arm-linux \

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

--sysroot=$PLATFORM


make -j8

make install


保存后,打开终端,cd到源码的根目录,执行chmod 777 build.sh(修改文件权限为可读可写可执行)

执行./build.sh编译就可以

这里需要注意的地方,Mac默认是不带yasm的,如果没有yasm会编译不过去,这时候只要安装yasm就可以

安装方法,终端下执行以下五个命令:

curl http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz >yasm.tar.gz

tar xzvf yasm.tar.gz

cd yasm-1.2.0

./configure

make

sudo make install

安装完以后再重新编译可以通过


编译ffmepg:

在ffmepg源码根目录下创建build.sh

代码如下:

##!/bin/sh

export ANDROID_NDK=/Users/wenxi/Library/Android/sdk/ndk-bundle#ndk目录根据你的安装目录

export PREBUILT=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt

export PLATFORM=$ANDROID_NDK/platforms/android-24/arch-arm

export PREFIX=../android-lib #编译结果的目录


build_one(){


./configure --target-os=linux --prefix=$PREFIX \

--enable-cross-compile \

--enable-runtime-cpudetect \

--disable-asm \

--arch=arm \

--disable-static \

--enable-shared \

--cc=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-gcc \

--cross-prefix=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi- \

--disable-stripping \

--nm=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-nm \

--sysroot=$PLATFORM \

--enable-gpl \

--disable-static \

--enable-shared \

--enable-version3 \

--enable-small \

--disable-vda \

--disable-iconv \

--disable-encoders \

--enable-libx264 \

--enable-encoder=libx264 \

--enable-encoder=pcm_alaw \

--enable-encoder=pcm_mulaw  \

--disable-muxers \

--enable-muxer=mov \

--enable-muxer=ipod \

--enable-muxer=psp \

--enable-muxer=mp4 \

--enable-muxer=avi \

--disable-decoders \

--enable-decoder=aac \

--enable-decoder=aac_latm \

--enable-decoder=h264 \

--enable-decoder=mpeg4 \

--enable-decoder=pcm_alaw \

--enable-decoder=pcm_mulaw \

--disable-demuxers \

--enable-demuxer=h264 \

--enable-demuxer=mov \

--disable-parsers \

--enable-parser=aac \

--enable-parser=ac3 \

--enable-parser=h264 \

--disable-protocols \

--enable-protocol=file \

--enable-protocol=rtmp \

--disable-bsfs \

--enable-bsf=aac_adtstoasc \

--enable-bsf=h264_mp4toannexb \

--disable-indevs \

--enable-zlib \

--disable-outdevs \

--disable-ffprobe \

--disable-ffplay \

--disable-ffmpeg \

--disable-ffserver \

--disable-debug \

--extra-cflags="-I/Volumes/Data/android-lib/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \

--extra-ldflags="-L/Volumes/Data/android-lib/lib"


make -j4 install




}


build_one

这里需要注意下几个地方--extra-cflags选项为刚刚编译出来的x264的头文件所在路径,根据自己需要改的,--extra-ldflags为x264的lib所在路径

ANDROID_NDK为ndk所在的路径,其他的功能根据自己需要删减,这里需要和老版本的ndk做出区别的地方在于,新版本的ndk目录和配置有明显的变化,比如:

老版本的教程里通常有

  1. export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt  

在新版里面已经不是4.6,本文的ndk是4.9,所以配置为:

export PREBUILT=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt

老版里面大多数用的是:

export PLATFORM=$NDK/platforms/android-8/arch-arm 

新版本里面已经没有android-8,这都是很老的版本了,我们直接用24

export PLATFORM=$ANDROID_NDK/platforms/android-24/arch-arm

还有一个最大的区别在于,老版本的ndk有这样的路径,

$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-nm \

注意到linux-x86_64这个文件夹,打开自己的ndk可以看到,自己的ndk已经改为了darwin-x86_64

于是把所有的linux-x86_64文件夹全部的路径全部改为darwin-x86_64,保存

最后改权限chmod 777 build.sh

执行./build.sh,就会看到在预设的目录里面有相对应的so库了,本文编译出来的so如图:

Mac 下为将ffmepg +x264移植到android中,解决libx264.so.148 库cannot find问题_第1张图片




X264源码:http://download.csdn.net/detail/qq_25817651/9617292


后续补一个遇到的问题:

x264编译出来的库是libx264.so.148,注意啦,这个坑啊,android 系统不能识别这样的库,会引发库打开异常,研究了半天,终于尝试到解决的办法,(注意,此处不能直接改文件名解决,因为改文件名并不会直接改变库的名字)

解决办法,打开x264的 configure文件,将"SONAME=libx264.so.$API"这里改为"SONAME=libx2641.so"(soname就是编译生成so库的名称的意思,这个名字不能是libx264.so,因为x264编译的时候会生成一个libx2641.so的中间文件,会冲突


Mac 下为将ffmepg +x264移植到android中,解决libx264.so.148 库cannot find问题_第2张图片


这里改成:

Mac 下为将ffmepg +x264移植到android中,解决libx264.so.148 库cannot find问题_第3张图片


最后,重新编译x264和ffmepg,注意要执行make clean 在两个脚本里了都添加这个命令就可以

这回生成的就是我们能用的so了:

Mac 下为将ffmepg +x264移植到android中,解决libx264.so.148 库cannot find问题_第4张图片


编译好的库,我已经上传,测试能用:http://download.csdn.net/detail/qq_25817651/9617990


你可能感兴趣的:(ffmepg,android)