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

原创 2016年08月30日 20:16:20

本人最近在研究音频视频这一块,考虑到后期开发要加很多功能,决定使用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如图:





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的中间文件,会冲突




这里改成:



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

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



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


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

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

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

Mac 下为将ffmepg +x264移植到android中(2)

上一篇文章说到,怎么将ffmepg打包成so库的编译过程,这篇文章将把上一篇文章的so库打包进android studio中,通常情况下只需要直接将so库和头文件直接放在libs下就可以,但是那样比较...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

将x264移植到Android

x264的版本是:x264-snapshot-20131228-2245 NDK的版本:android-ndk-r8b 虚拟机VMware9.0.2,Ubuntu12.04,

解决:Cannot find System Java Compiler. Ensure that you have installed a JDK (not just a JRE)

导入github上的项目,有时候,就会报如下的错误 Error:Execution failed for task ':app:compileDebugJava'. > Cannot find S...

移植x264到vs2008

最新的x264已经没有提供windows版的可编译工程,微软的VS编程开发工具无疑是最好的调试工具,要把它移植到vs开发环境下面有很多的工作要做。 网上也有很多人在问找x264的vs版本,本人根...

Cocos2d-x移植到WindowsPhone8移植问题-libcurl库移植问题

在Cocos2d-x 3.x最新版本中提供了Windows Phone 8平台移植libcurl库所需要的头文件和库文件。但要在Windows Phone 8平台成功移植libcurl库还是很不容易,...

Cocos2d-x移植到WindowsPhone8移植问题-libNetwork库移植问题

Cocos2d-x提供了libNetwork库的源代码,而且还提供了libNetwork库的源代码Visual Studio 2012工程文件libNetwork.vcxproj,这样就更方便移植了。...

ffmepg移植到android实现RTSP客户端-问题小记

题记:主要是参考这位大神的杰作,在此非常感谢,用到的代码就是这位大神的,请重点看看http://blog.csdn.net/nieyongs/article/details/21407033,我这里主...

解决/usr/bin/ld: cannot find -lxxx 问题

问题: 在linux环境编译应用程式或lib的source code时常常会出现如下的错误讯息: /usr/bin/ld: cannot find -lxxx 这些讯...

X264优化

现在VS2008上做一些代码精简性优化。如果代码体积过于庞大的话会出现在DSPload不进去的情况,也会给空间存储分配带来麻烦。1、去掉common.c中的x264_log()和x264_log_de...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)