摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程。
环境准备:
Ubuntu12.04 TLS
android-ndk-r9d-linux-x86_64.tar.bz2
ffmpeg3.0
第一步:下载
1.配置ubuntu12.04 TLS 系统环境。
2.下载ndk版本为 r9d。
3.下载ffmpeg3.0版本。
第二步:在ubuntu下编译环境设置
1. 安装好ubuntu12.04 TLS 32位linux系统之后,可以选择安装一下内容:
32位ubuntu下还需要下载 gcc-multilib 和g++-multilib:
查看系统是否安装gcc-multilib 和g++-multilib: dpkg -l|grep gcc 和 dpkg -l|grep g++
终端命令:" sudo apt-get install bison gcc-multilib g++-multilib "
2.下载ndk之后解压后目录:/home/tan/work/android/tools/android-ndk-r9d
3.解压ffmpeg-3.0源码
将ffmpeg-3.0.tar.gz解压后拷贝到任意目录,本例是拷贝到.../android-ndk-r9d/sample/ffmpeg3.0 目录内。
拷贝之后添加" build_android.sh "文件:
#!/bin/bash SYSROOT=$NDK/platforms/android-9/arch-arm/ TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64 function build_one { ./configure \ --prefix=$PREFIX \ --enable-shared \ --disable-static \ --disable-doc \ --disable-ffserver \ --enable-cross-compile \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG } CPU=arm PREFIX=$(pwd)/android/$CPU ADDI_CFLAGS="-marm" build_one
有的资料上面 build_android.sh 的前几行是这样写的:
修改configure文件:
很多ffmpeg编译资料上面说要修改configure文件 ,说的原因是 如果不修改的话,在android上 System.loadLibrary("xxx"); 的时候个别so库无法加载的问题。
打开 ffmpeg源码内 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)' 替换为: SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS='$(SLIBNAME)'
第三步:在ubuntu 32位下进行编译ffmpeg源码以得到android平台 arm下能使用的那几个so库
1.给build_android.sh 和 configure 增加可执行权限:
终端执行:
“ $chmod+x ./build_android.sh ”
“ $chmod+x ./configure ”
2.最后编译:
终端执行:
“ $ ./build_android.sh ”
“ $ make ”
“$ make install ”
----------------------
编译成功会在ffmpeg源码目录下生成一个“android”目录里面有编译好的 so库和 需要的头文件等等。
其中so库应该是一下几个:
libavutil-52.so libavcodec-55.so libswresample-0.so libavformat-55.so libswscale-2.so libpostproc-52.so libavfilter-4.so libavdevice-55.so
第四步:android下使用这几个库:
----------------------------------------------------
1.使用NDK里sample目录下的hello-jni 工程进行使用这几个库:
(a.)在hello-jni 源码的JNI目录下新建ffmpeglib目录,把那几个库全部拷贝到 /hello-jni/jni/ffmpeglib/ 目录下。
(b.)然后把编译好的ffmpeg的头文件全部拷贝到 /hello-jni/jni/ 目录下。
(c.)在 hello-jni.c 文件内进行使用ffmpeg:
#include <string.h> #include#include jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { char str[25]; sprintf(str, "%d", avcodec_version()); return (*env)->NewStringUTF(env, str); }
(d.)在 HelloJni.java 文件加载so库进行调用JNI内的测试函数:
static { System.loadLibrary("avutil-52"); System.loadLibrary("avcodec-55"); System.loadLibrary("swresample-0"); System.loadLibrary("avformat-55"); System.loadLibrary("swscale-2"); System.loadLibrary("postproc-52"); System.loadLibrary("avfilter-4"); System.loadLibrary("avdevice-55"); System.loadLibrary("hello-jni"); } public native String stringFromJNI();
(e.)修改 hello-jni 源码中jni目录下的 Android.mk 文件:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := avcodec-55-ffmpeglib LOCAL_SRC_FILES := ffmpeglib/libavcodec-55.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := avdevice-55-ffmpeglib LOCAL_SRC_FILES := ffmpeglib/libavdevice-55.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := avfilter-4-ffmpeglib LOCAL_SRC_FILES := ffmpeglib/libavfilter-4.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := avformat-55-ffmpeglib LOCAL_SRC_FILES := ffmpeglib/libavformat-55.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := avutil-52-ffmpeglib LOCAL_SRC_FILES := ffmpeglib/libavutil-52.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := avswresample-0-ffmpeglib LOCAL_SRC_FILES := ffmpeglib/libswresample-0.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := swscale-2-ffmpeglib LOCAL_SRC_FILES := ffmpeglib/libswscale-2.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := postproc-52-ffmpeglib LOCAL_SRC_FILES := ffmpeglib/libpostproc-52.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid LOCAL_SHARED_LIBRARIES := avcodec-55-prebuilt avdevice-55-prebuilt avfilter-4-prebuilt avformat-55-prebuilt avutil-52-prebuilt swscale-2-prebuilt postproc-52-prebuilt avswresample-0-prebuilt include $(BUILD_SHARED_LIBRARY)
(f.)windows下使用cygwin编译hello-jni工程:
" $NDK/ndk-build "
生成 libhello-jni.so 完成。