Ubuntu下編譯android所需ffmpeg的so庫
編譯ffmpeg原始碼
環境說明
環境(包括版本)儘量下面的保持一致,其他環境不一定能成功。
系統: Ubuntu16.04 LTS
最好不要再windows系統下編譯,可在windows中安裝VMware虛擬一個linux系統出來,對linux系統不太熟悉的建議使用Ubuntu,入門比較快。
NDK版本: android-ndk-r9d
ffmpeg版本: ffmpeg-3.2.9
使用過最新的ffmpeg-3.4編譯並未成功,於是使用了3.2.9。下載地址(建議下載tar.bz2的):https://ffmpeg.org/download.html#releases
修改configure
在ffmpeg根目錄找到configure檔案,由於根據此配置檔案(在ffmpeg原始碼的根目錄)生成的so名字類似於libXXX.05421423.so;android不能失敗了帶有數字的so庫;需要將生成so庫名字的配置修改一下,主要有四個地方.
將以下的內容:
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_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
生成config.h檔案
在ffmpeg根目錄中輸入一下命令:
./configure
如果有錯誤提示,根據提示來,在./configure 後面加上提示引數即可(注意是兩個-),如:
建立編譯指令碼
在與ffmpeg同級目錄建立一個用於存放編譯後生成的動態庫的資料夾,這裡叫armlib
在與ffmpeg同級的目錄下新建build-ffmpeg-arm.sh檔案,內容為:
#!/bin/bash
#需要改成你的ffmpeg原始碼地址
cd /home/hdl/ffmpeg/ffmpeg-3.2.9
make clean
#需要改成你的ndk地址
export NDK=/home/hdl/tools/android-ndk-r9d
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt
export PLATFORM=$NDK/platforms/android-8/arch-arm
#這裡是最後生成的庫檔案存放的位置,改成你自己的即可
export PREFIX=/home/hdl/ffmpeg/armlib
build_one(){
./configure --target-os=linux --prefix=$PREFIX \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--enable-gpl --enable-shared --disable-static --enable-small \
--disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \
--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv6"
}
build_one
make
make install
cd ..
注意:以上生成的是armeabi型別的so,armeabi已能涵蓋大部分安卓手機,其他型別的需要更改一下配置。
為build-ffmpeg-arm.sh授予可執行的許可權
命令列下輸入:
chmod +x build-ffmpeg-arm.sh
開始編譯
./build-ffmpeg-arm.sh
等待幾分鐘,會在/home/hdl/ffmpeg/armlib(這是我自己的哦,即configure中設定的PREFIX地址)目錄下面生成編譯後的檔案。
注意:請使用帶有版本號的so檔案(如:libavcodec-57.so),不帶版本號的只是一個”快捷方式”