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中(2)

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

android ffmepg+x264 编译好的库

  • 2016年08月31日 16:02
  • 3.38MB
  • 下载

Mac下为Android编译FFMPEG和x264 (一)

前言 ffmpeg是一个超级牛逼的音视频软件,它几乎可以处理市面上常见的所有音视频格式,许多著名的软件都是基于ffmpeg的,比如kmplayer之类的播放器,格式工厂之类的格式转换软件等。并且...

Android移植带有libx264实现的ffmpeg

一、环境准备 1、Ubuntu系统(我使用VirtualBox搭建的虚拟机)。 2、最新的ffmpeg源码 3、最新的libx264的源码二、开始搞事情 1、下载最新的ffmpeg、x264源...

移植带X264库的FFMPEG到ANDROID(win7上,用MINGW)

编译FFMPEG到ANDROID,可以有两种选择,一种是在UBUNTU上,另外一种是在WINDOWS上用MINGW或者CYGWIN编译,UBUNTU上的编译过程比较简单,CYCWIN可以参考http:...

集成ffmpeg/x264:ERROR: libx264 not found的问题

在配置的时候,要注意一下NDK的安装路径,替换成自己NDK的安装路径。

mac 下移植 ffmpeg 支持x264 faac lame png 开启asm neon 加速

mac 下移植 ffmpeg 支持x264 faac lame png 开启asm neon 加速  1. 获取 ffmpeg 源码 http://ffmpeg.org/releases/ffmpeg...

mac 下移植 x264 使用 neon 多线程加速

mac 下移植 x264 使用 neon加速 1.获取x264源码 git clone http://git.videolan.org/git/x264.git 2. 再...

ffmepg以及x264的编译

介绍Linux(ubuntu)与windows环境下的FFmpeg、X264库的编译。编辑器包括,Visual studi、GCC、MinGW...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mac 下为将ffmepg +x264移植到android中,解决libx264.so.148 库cannot find问题
举报原因:
原因补充:

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