目录[隐藏] |
下载ndk
此处下载的是android-ndk-r8e
官网上只有最新版下载链接,如果想要下载以前的版本,可打开https://archive.org/web/,然后输入
http://developer.android.com/tools/sdk/ndk/index.html
然后选择日期,比如2013年的6月。
解压/root/ffmpeg_compile/android-ndk-r8e,以$NDK代表此目录。
下载FFmpeg源代码
此处用的是ffmpeg-2.0.tar.bz2。解压到$NDK/sources目录下。得到$NDK/sources/ffmpeg-2.0目录。
The reason we built our ffmpeg source code under $NDK/sources folder is that NDK build system will search for
directories under this path for external modules automatically.
修改configure文件
找到
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)'
This cause ffmpeg shared libraries to be compiled to libavcodec.so.<version> (e.g. libavcodec.so.55), which is not
compatible with Android build system.
改成
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS='$(SLIBNAME)'
编译FFmpeg
复制下面内容,并保存为build_android.sh,然后放到$NDK/sources/ffmpeg-2.0目录下
#!/bin/bash NDK=/root/ffmpeg_compile/android-ndk-r8e SYSROOT=$NDK/platforms/android-9/arch-arm/ TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64 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,SYSROOT,TOOLCHAIN需要修改成你自己的路径。
如果脚本不能执行,执行:
yum install dos2unix dos2unix build_android.sh chmod +x build_android.sh ./build_android.sh
We disabled static library and enabled shared library. Note that the build script is not optimized for a particular CPU.
执行完成后,会输出到$NDK/sources/ffmpeg-2.0/android目录下,其中包含arm/lib and arm/include目录
Note that the arm/lib folder contains both the library files (e.g.: libavcodec-55.so) and symbolic links (e.g.:
libavcodec.so) to them. We can remove the symbolic links to avoid confusion.
配置FFmpeg库
新建$NDK/sources/ffmpeg-2.0.1/android/arm/Android.mk
Android NDK allows us to reuse a compiled module through the “import-module” build command.
内容如下:
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-3.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)
如何在自己的工程中引用FFmpeg库
在jni目录下新建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ffcopy LOCAL_SRC_FILES := ffcopy.c LOCAL_LDLIBS := -llog -lz -landroid LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil include $(BUILD_SHARED_LIBRARY) $(call import-module,ffmpeg-2.0/android/arm)
在jni目录下新建Application.mk,内容如下:
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-8
android-8 corresponds to android SDK 2.2
然后运行ndk-build编译,在libs目录下会得到相应库。 在Java代码中引用方法:
static { // 加载本地so库文件,注意顺序 System.loadLibrary("avutil-52"); System.loadLibrary("avcodec-55"); System.loadLibrary("avformat-55"); System.loadLibrary("swscale-2"); System.loadLibrary("ffcopy"); }
本文用到的部分文件下载:http://dl.vmall.com/c04w3kyzqt