FFmpeg Android部分的编译

编译的是最新版2.2.3。再说编译环境

操作系统 ubuntu14.04 32位(实在不建议使用64位 惨痛的教训)

adt:Build: v22.6.2-1085508

NDK:R9d

因为之前就看到有人提到0.8版会出现一些问题,这也难怪,所以开始目标就瞄准了最新的代码进行编译

首先下载FFmpeg源码,从http://ffmpeg.org/download.html 可以获取最新版的源码,不管是git或者直接下载解压都可以 下载完成后放入NDK目录下source文件夹 文件名大概位ffmpeg-2.2.3,

1.首先修改configuration文件,会直接影响到生成的so文件命名

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

 2.生成build_android.sh文件

#!/bin/bash
NDK=$HOME/Desktop/adt/android-ndk-r9d
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86
function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU 
ADDI_CFLAGS="-marm"
build_one

 首先需要注意的是NDK的目录,如果一再找不到某些编译器 例如g++ 可以试着SYSROOT以及TOOLCHAIN都写成绝对路径,编译如果失败 密切注意config.log文件,最下几行,看好log可以让你少走很多弯路,一味的机械的执行别人写的教程只会让你离成功编译越来越远,找到一条属于自己的路。之前系统64位编译时,会出现乱码,侥幸贼心不死,回到家以后又尝试了一下,一次编译过去,至此发现本地环境有问题,一样的代码一个的脚本,两个结果,没有精力深究,换到32位,一帆风顺。(家里是64位)

至此,应该创建了android文件夹 并且文件夹下有了arm文件夹。恭喜你,编译成功了。去掉lib中的link文件,就剩下调用了。

3.在android/arm目录下创建Android.mk文件 直接影响到后面项目中的加载以及调用。(放到source下就是为了在多个项目中统一调用)

LOCAL_PATH:= $(call my-dir)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-55.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-55.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-2.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-52.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-4.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libwsresample
LOCAL_SRC_FILES:= lib/libswresample-0.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

  这里需要注意的是文件名 我在编译时filter已经到了-4 而参考的mk还是写的-3 不改会提示找不到文件

到现在 有了so文件 也有了so文件的声明 在项目里见效果吧  项目也只需引用该本地资源即可

LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
 
LOCAL_MODULE    := tutorial03
LOCAL_SRC_FILES := tutorial03.c
LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid
LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil
 
include $(BUILD_SHARED_LIBRARY)
$(call import-module,ffmpeg-2.2.3/android/arm)

编译过程中也经历了无数的失败 也深刻认识到拿来注意多害人FFmpeg Android部分的编译 弯路走多了不要紧 能吸取教训就行

我的指路明灯:http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/

相关推荐