准备工作
下载最新的 ffmpeg 下载地址为:
下载 ndk 下载地址为 :
http://developer.android.com/ndk/downloads/index.html
下载后文件在 Mac 中的存放路径如下:
ChendeMacBook-Pro:compileFF chenzongwen
lsandroid−ndk−r11bffmpeg−3.0ChendeMacBook−Pro:compileFFchenzongwen
pwd
/Users/chenzongwen/compileFF
ChendeMacBook-Pro:compileFF chenzongwen$
编译 ffmpeg
首先进入 ffmpeg-3.0文件夹 ,在文件夹中增加 编译脚本 ffmpegConfig 文件如下图 :
ChendeMacBook-Pro:ffmpeg-3.0 chenzongwen$ ls
COPYING.GPLv2 RELEASE_NOTES config.h ffmpeg_filter.c ffprobe.c libavutil
COPYING.GPLv3 VERSION config.log ffmpeg_filter.d ffprobe.d libpostproc
COPYING.LGPLv2.1 arch.mak config.mak ffmpeg_filter.o ffprobe.o library.mak
COPYING.LGPLv3 cmdutils.c configure ffmpeg_g ffprobe_g libswresample
CREDITS cmdutils.d doc ffmpeg_opt.c ffserver.c libswscale
Changelog cmdutils.h ffmpeg ffmpeg_opt.d ffserver_config.c presets
INSTALL.md cmdutils.o ffmpeg.c ffmpeg_opt.o ffserver_config.h tests
LICENSE.md cmdutils_common_opts.h ffmpeg.d ffmpeg_qsv.c libavcodec tools
MAINTAINERS cmdutils_opencl.c ffmpeg.h ffmpeg_vdpau.c libavdevice version.sh
Makefile common.mak ffmpeg.o ffmpeg_videotoolbox.c libavfilter
README.md compat ffmpegConfig ffplay.c libavformat
RELEASE config.fate ffmpeg_dxva2.c ffprobe libavresample
ChendeMacBook-Pro:ffmpeg-3.0 chenzongwen$
ffmpegConfig文件内容如下:
#!/bin/bash
NDK=/Users/chenzongwen/compileFF/android-ndk-r11b
export PATH=$PATH:$NDK
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function build_one
{
bash ./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 \
--extra-libs=-lgcc \
--sysroot=$SYSROOT \
--enable-asm \
--enable-neon \
--extra-cflags="-O3 -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm -mfpu=neon"
build_one
~
~
然后在当前文件夹下执行如下命令:
1、chenzongwen
./ffmpegConfig2、chenzongwen
make -j4 //4 为 用4个cup进行编译
3、chenzongwen$ make install
命令执行完之后会在当前文件夹下生成一个android 文件夹 android/arm 文件夹中的内容如下几个文件夹 : bin include lib share
include 中存放的是头文件, lib 中存放的是 so 文件 整个编译过程结束 。
如何使用 ffmpeg
1、 在跟 anroid-ndk-r11b ffmpeg-3.0 同级的目录下 创建 jni 文件夹
如下 :
ChendeMacBook-Pro:compileFF chenzongwen
mkdirjniChendeMacBook−Pro:compileFFchenzongwen
ls
android-ndk-r11b ffmpeg-3.0 jni
2、将之前编译的头文件(在 include 文件夹下)拷贝到 jni 文件夹下 并且在 jni 文件夹下创建prbuilt文件夹 并将之前生成的 so(在 lib 文件夹下)拷贝到 prebuilt 文件夹下, 拷贝完成后如下图:
ChendeMacBook-Pro:jni chenzongwen$ ls
libavcodec libavdevice libavfilter libavformat libavutil libswresample libswscale prebuild
ChendeMacBook-Pro:jni chenzongwen$ ls prebuild/
libavcodec-57.so libavfilter-6.so libavutil-55.so libswscale-4.so
libavdevice-57.so libavformat-57.so libswresample-2.so libswscale.so
ChendeMacBook-Pro:jni chenzongwen$
3、调用 so 方法 在当前文件夹下添加两个文件 Android.mk 和 Application.mk 内容分别如下 Android.mk 内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := avcodec-56-prebuilt
LOCAL_SRC_FILES := prebuilt/libavcodec-57.so
include $(PREBUILT_SHARED_LIBRARY)
#include $(CLEAR_VARS)
#LOCAL_MODULE := avdevice-56-prebuilt
#LOCAL_SRC_FILES := prebuilt/libavdevice-57.so
#include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avfilter-5-prebuilt
LOCAL_SRC_FILES := prebuilt/libavfilter-6.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avformat-56-prebuilt
LOCAL_SRC_FILES := prebuilt/libavformat-57.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avutil-54-prebuilt
LOCAL_SRC_FILES := prebuilt/libavutil-55.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avswresample-1-prebuilt
LOCAL_SRC_FILES := prebuilt/libswresample-2.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swscale-3-prebuilt
LOCAL_SRC_FILES := prebuilt/libswscale-4.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
Application.mk 的内容如下 :
ChendeMacBook-Pro:jni chenzongwen$ vim Application.mk
APP_ABI := armeabi
#APP_ABI := armeabi-v7a
APP_PLATFORM := android-10
编写调用文件 在当前文件夹下创建 com.owenchan.Test.c 文件 测试内容如下:
#include <math.h>
#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavutil/samplefmt.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/pixfmt.h>
#include <stdio.h>
#include <wchar.h>
#include <jni.h>
#include <android/bitmap.h>
#include <string.h>
/*for android logs*/
#include <android/log.h>
#ifdef __cplusplus
extern "C" {
#endif
#if DEBUG
# define D(x...) __android_log_print(ANDROID_LOG_INFO, "h264decoder", x)
#else
# define D(...) do {} while (0)
#endif
JNIEXPORT jint JNICALL Java_com_owenchan_Test_sum
(JNIEnv * env, jobject obj,jint w, jint h)
{
return w * h;
}
#ifdef __cplusplus
}
#endif
开始编译 在 jni 目录下执行 :
ChendeMacBook-Pro:jni chenzongwen$ ../android-ndk-r11b/ndk-build
最后将 如下目录下的so 拷贝到工程中就可以使用了。
ChendeMacBook-Pro:armeabi chenzongwen$ pwd
/Users/chenzongwen/compileFF/libs/armeabi
ChendeMacBook-Pro:armeabi chenzongwen$ ls
libavcodec-57.so libavutil-55.so libswscale-4.so
libavfilter-6.so libowenchan_Test.so
libavformat-57.so libswresample-2.so
ChendeMacBook-Pro:armeabi chenzongwen$