本人最近在研究音頻視頻這一塊,考慮到後期開發要加很多功能,決定使用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目錄和配置有明顯的變化,比如:
老版本的教程裏通常有
- 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