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如圖:





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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章