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下就可以,但是那样比较...
  • qq_25817651
  • qq_25817651
  • 2016年08月31日 10:54
  • 338

Android移植带有libx264实现的ffmpeg

一、环境准备 1、Ubuntu系统(我使用VirtualBox搭建的虚拟机)。 2、最新的ffmpeg源码 3、最新的libx264的源码二、开始搞事情 1、下载最新的ffmpeg、x264源...
  • a992036795
  • a992036795
  • 2016年12月30日 13:05
  • 1936

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

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

Mac下为Android Studio编译Ffmpeg(一)ndk部分

本文参考http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/。 但它只适合做编码,而且没有Android Studio配置的部分。 1、下载n...
  • coloriy
  • coloriy
  • 2015年08月06日 14:45
  • 1151

FFmpeg的Android平台移植—编译篇

FFmpeg的Android平台移植—编译篇 Dennis Hu 2014年3月28日 摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程。 环境准备: Ub...
  • gobitan
  • gobitan
  • 2014年04月01日 19:11
  • 88550

将x264移植到Android

x264的版本是:x264-snapshot-20131228-2245 NDK的版本:android-ndk-r8b 虚拟机VMware9.0.2,Ubuntu12.04,...
  • huahuahailang
  • huahuahailang
  • 2014年05月28日 20:36
  • 6148

MAC下使用ndk编译ffmpeg

ffmpeg是c语言的库,主要作用是对音视频进行编解码等操作。是android进阶必须要掌握的一门技术。通过使用ffmpeg可以提高对android ndk的认识和熟练度。第一步当然就是编译ffmpe...
  • ZACH_ZHOU
  • ZACH_ZHOU
  • 2017年12月20日 17:56
  • 57

在Android下编译ffmpeg+x264+libfdk-aac的常见问题和解决方法

搞多媒体开发的对ffmpeg、libfdk-aac、x264这几个库应该都比较熟悉,在此不多做介绍。最近公司需要升级多媒体库,第一步工作就是将ffmpeg+x264+libfdk-aac移植到Andr...
  • x5_miao
  • x5_miao
  • 2017年05月22日 19:50
  • 598

编译Android下可用的全平台FFmpeg(包含libx264与libfdk-aac)

源码或工具版本: ndk :r14 FFmpeg 版本:3.2.5 libfdk-aac 版本:0.1.5 一、源码准备: 这里假设你已经拥有了ndk环境,没有的可以先配置,可以参考An...
  • mabeijianxi
  • mabeijianxi
  • 2017年07月06日 14:38
  • 4216

V4L2视频采集与H264编码3—X264移植

计划将YUV数据编码成H264视频,中间需要用到X264编码器。X264编码器的源码分析参考了雷神的博客x64源码分析 ,这里将介绍如何将x264编码库移植到ARM开发板上。最新的x264代码可以在x...
  • li_wen01
  • li_wen01
  • 2016年12月11日 11:33
  • 1696
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mac 下为将ffmepg +x264移植到android中,解决libx264.so.148 库cannot find问题
举报原因:
原因补充:

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