ubuntu+ndk編譯ffmpeg
近來想把ffmpeg移植到android上來用,所以就研究了兩天,從網(wǎng)上亂搜一通,網(wǎng)上都說在linux系統(tǒng)下比較好編譯通過,所以就聽取了意見,裝了vmware在里面裝了個ubuntu13.04的64位系統(tǒng),緊接著我就迫不及待的http://developer.android.com/tools/sdk/ndk/index.html下載了android-ndk-r9b-linux-x86_64.tar.bz2在ubuntu系統(tǒng)下配置好了NDK的環(huán)境變量,又從ffmpeg官網(wǎng)下載了ffmpeg2.0.1版本的源碼,可是按照:http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/ 這個教程搞了一天都沒編譯通過,老是報一些莫名奇妙的錯誤:“找不到所在目錄和文件”??赡苁俏夷莻€地方配置的不對吧。要就有那位兄弟用這個教程編譯ffmpeg成功生成libffmpeg.so文件的告訴我一聲。
本文引用地址:http://m.butianyuan.cn/article/201610/305656.htm這個方法不行那就換個方法嘍!看到網(wǎng)上說ffmpeg不同版本編譯方式也有所不同,既然這樣的話,我就換了一個低版本的ffmpeg0.8.1。下載此版本的鏈接為:http://www.ffmpeg.org/releases/ffmpeg-0.8.1.tar.gz 同樣ndk也換了個低版本的。下載鏈接為:http://dl.google.com/android/ndk/android-ndk-r6-linux-x86.tar.bz2
一、在ubuntu下配置android ndk環(huán)境變量
把下載好的android-ndk-r6版本解壓到/home/ysx目錄下(注:ysx這個文件夾是我的,這個目錄可以隨意換)。
按Alt+F2在搜索框中輸入gnome-terminal,運行它。在出來的這個命令窗口中輸入:gedit ~/.bashrc 回車在跳出來的文件末尾添加:export NDK=/home/ysx/android-ndk-r6 換行 export PATH=${PATH}:$NDK 保存關(guān)閉。
source ~/.bashrc使其修改的文件生效。
ndk-build看看咱們配置環(huán)境變量成功沒,只要沒出command not found就證明環(huán)境變量配置成功。
二、下載ffmpeg源碼
我用ffmpeg0.8.1編譯成功了,所以此教程只針對這個版本的。下載網(wǎng)址為:http://www.ffmpeg.org/releases/ffmpeg-0.8.1.tar.gz。
解壓它。
三、配置ffmpeg環(huán)境
首先在/home/ysx/android-ndk-r6目錄下新建一個以ffmpeg命名的文件夾。
把存放ffmpeg源碼的文件夾改名為jni,然后把存放ffmpeg源碼的jni文件夾剪切到/home/ysx/android-ndk-r6/ffmpeg目錄下。
進入到j(luò)ni文件夾里,在里面創(chuàng)建一個名字為config.sh的文件。
添加config.sh文件的內(nèi)容,內(nèi)容如下:(注:cross-prefix、extra-cflags、extra-ldflags這三個參數(shù)后面的路徑可以根據(jù)自己路徑修改)
./configure
--disable-static
--enable-shared
--enable-gpl
--enable-version3
--enable-nonfree
--disable-doc
--disable-ffmpeg
--disable-ffplay
--disable-ffprobe
--disable-ffserver
--disable-avdevice
--disable-avfilter
--disable-postproc
--enable-small
--cross-prefix=/home/ysx/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-
--enable-cross-compile
--target-os=linux
--extra-cflags='-I/home/ysx/android-ndk-r6/platforms/android-9/arch-arm/usr/include'
--extra-ldflags='-L/home/ysx/android-ndk-r6/platforms/android-9/arch-arm/usr/lib -nostdlib'
--arch=arm
--disable-symver
--disable-debug
--disable-stripping
sed -i's/HAVE_LRINT 0/HAVE_LRINT 1/g'config.h
sed -i's/HAVE_LRINTF 0/HAVE_LRINTF 1/g'config.h
sed -i's/HAVE_ROUND 0/HAVE_ROUND 1/g'config.h
sed -i's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g'config.h
sed -i's/HAVE_TRUNC 0/HAVE_TRUNC 1/g'config.h
sed -i's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g'config.h
四、執(zhí)行config.sh腳本文件
首先必須保證你的光標定位到了jni文件夾里(注:~/android-ndk-r6/ffmpeg/jni$)
給config.sh的執(zhí)行權(quán)限:sudo chmod a+x config.sh
執(zhí)行腳本:./config.sh
出現(xiàn)下圖的樣子就證明執(zhí)行
五、把Android.mk文件移到j(luò)ni文件夾里
Android.mk文件內(nèi)容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
include $(LOCAL_PATH)/config.mak
LOCAL_CFLAGS := -DHAVE_AV_CONFIG_H -std=c99
AVUTIL_C_FILES = adler32.c
aes.c
audioconvert.c
avstring.c
base64.c
cpu.c
crc.c
des.c
error.c
eval.c
fifo.c
file.c
imgutils.c
intfloat_readwrite.c
inverse.c
lfg.c
lls.c
log.c
lzo.c
mathematics.c
md5.c
mem.c
dict.c
opt.c
parseutils.c
pixdesc.c
random_seed.c
rational.c
rc4.c
samplefmt.c
sha.c
tree.c
utils.c
arm/cpu.c
AVUTIL_SRC_FILES = $(addprefix libavutil/, $(sort $(AVUTIL_C_FILES)))
AVCODEC_C_FILES = allcodecs.c
audioconvert.c
avpacket.c
bitstream.c
bitstream_filter.c
dsputil.c
faanidct.c
fmtconvert.c
imgconvert.c
jrevdct.c
options.c
parser.c
raw.c
評論