1. 程式人生 > >Ubuntu下編譯android所需ffmpeg的so庫

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),不帶版本號的只是一個”快捷方式”