ubuntu+ndk编译ffmpeg
近来想把ffmpeg移植到android上来用,所以就研究了两天,从网上乱搜一通,网上都说在linux系统下比较好编译通过,所以就听取了意见,装了vmware在里面装了个ubuntu13.04的64位系统,紧接着我就迫不及待的http://developer.android.com/tools/sdk/ndk/index.html下载了android-ndk-r9b-linux-x86_64.tar.bz2在ubuntu系统下配置好了NDK的环境变量,又从ffmpeg官网下载了ffmpeg2.0.1版本的源码,可是按照:http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/ 这个教程搞了一天都没编译通过,老是报一些莫名奇妙的错误:“找不到所在目录和文件”。可能是我那个地方配置的不对吧。要就有那位兄弟用这个教程编译ffmpeg成功生成libffmpeg.so文件的告诉我一声。
这个方法不行那就换个方法喽!看到网上说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环境变量
把下载好的android-ndk-r6版本解压到/home/ysx目录下(注:ysx这个文件夹是我的,这个目录可以随意换)。
按Alt+F2在搜索框中输入gnome-terminal,运行它。在出来的这个命令窗口中输入:gedit ~/.bashrc 回车在跳出来的文件末尾添加:export NDK=/home/ysx/android-ndk-r6 换行 export PATH=${PATH}:$NDK 保存关闭。
source ~/.bashrc使其修改的文件生效。
ndk-build看看咱们配置环境变量成功没,只要没出command not found就证明环境变量配置成功。
二、下载ffmpeg源码
我用ffmpeg0.8.1编译成功了,所以此教程只针对这个版本的。下载网址为:http://www.ffmpeg.org/releases/ffmpeg-0.8.1.tar.gz。
解压它。
三、配置ffmpeg环境
首先在/home/ysx/android-ndk-r6目录下新建一个以ffmpeg命名的文件夹。
把存放ffmpeg源码的文件夹改名为jni,然后把存放ffmpeg源码的jni文件夹剪切到/home/ysx/android-ndk-r6/ffmpeg目录下。
进入到jni文件夹里,在里面创建一个名字为config.sh的文件。
添加config.sh文件的内容,内容如下:(注:cross-prefix、extra-cflags、extra-ldflags这三个参数后面的路径可以根据自己路径修改)
./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
四、执行config.sh脚本文件
首先必须保证你的光标定位到了jni文件夹里(注:~/android-ndk-r6/ffmpeg/jni$)
给config.sh的执行权限:sudo chmod a+x config.sh
执行脚本:./config.sh
出现下图的样子就证明执行
![](../img/eep/emb/emb-51643rain5b4wdhq.jpg)
五、把Android.mk文件移到jni文件夹里
Android.mk文件内容如下:
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_
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)