这篇文章是转载自开源中国,作者huntking
今天找了很久,其他的博客有的是太旧了,要求NDK降级之r5,有的又出现问题,没有解决方案,良久才发现这篇文章按照步骤,终于生成了libffmpeg.so,转载过来,希望帮到更多的人
原文地址:http://my.oschina.net/wangqin/blog/80345
Android NDK r8b和FFmpeg 0.11.2移植
1、 准备Ubuntu 12.04虚拟机,推荐使用VirtualBox
2、 Ubuntu中安装相应的编译开发软件,如:build-essential之类的东西
3、 下载Android NDK r8b和Android SDK, all for linux,注意这个文档中使用的是Android NDK r8b和Android SDK 20
4、 下载FFmpeg,这个文档中使用的是:FFmpeg 0.11.2版本
5、 详细编译步骤:
5.1、创建工作目录:当前目录为:~/
(1)、
(2)、
5.2、进入目录jni,当前目录为:~/lplayer/jni,解压ffmpeg源码包
(1)、
(2)、解压后,重命名ffmpeg源码文件为:
1 |
mv ffmpeg_original ffmpeg |
(3)、得到目录为:~/lpayer/jni/ffmpeg
5.3、创建相应NDK配置文件:
(1)~/lplayer/jni/Android.mk
1 |
include $(all-subdir-makefiles) |
(2)~/lplayer/jni/ffmpeg/Android.mk
01 |
LOCAL_PATH := $(call my- dir ) |
05 |
LOCAL_WHOLE_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale |
07 |
LOCAL_MODULE := ffmpeg |
09 |
include $(BUILD_SHARED_LIBRARY) |
11 |
include $(call all-makefiles-under,$(LOCAL_PATH)) |
(3)~/lplayer/jni/ffmpeg/av.mk
05 |
include $(LOCAL_PATH)/../config.mak |
13 |
include $(LOCAL_PATH)/Makefile |
17 |
OBJS-$(HAVE_MMX) += $(MMX-OBJS- yes ) |
23 |
FFLIBS := $(foreach,NAME,$(FFLIBS),lib$(NAME)) |
25 |
FFCFLAGS = -DHAVE_AV_CONFIG_H -Wno-sign-compare -Wno-switch -Wno-pointer-sign |
27 |
FFCFLAGS += -DTARGET_CONFIG=\"config-$(TARGET_ARCH).h\" |
29 |
ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S) |
31 |
ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES))) |
33 |
ifneq ($(ALL_S_FILES),) |
35 |
ALL_S_OBJS := $(patsubst %.S,%.o,$(ALL_S_FILES)) |
37 |
C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS)) |
39 |
S_OBJS := $(filter $(ALL_S_OBJS),$(OBJS)) |
49 |
C_FILES := $(patsubst %.o,%.c,$(C_OBJS)) |
51 |
S_FILES := $(patsubst %.o,%.S,$(S_OBJS)) |
53 |
FFFILES := $( sort $(S_FILES)) $( sort $(C_FILES)) |
(4)~/lplayer/jni/ffmpeg/libavcodec/Android.mk
01 |
LOCAL_PATH := $(call my- dir ) |
05 |
include $(LOCAL_PATH)/../av.mk |
07 |
LOCAL_SRC_FILES := $(FFFILES) |
15 |
LOCAL_CFLAGS += $(FFCFLAGS) |
19 |
LOCAL_STATIC_LIBRARIES := $(FFLIBS) |
21 |
LOCAL_MODULE := $(FFNAME) |
23 |
include $(BUILD_STATIC_LIBRARY) |
(5)~/lplayer/jni/ffmpeg/libavformat/Android.mk
01 |
LOCAL_PATH := $(call my- dir ) |
05 |
include $(LOCAL_PATH)/../av.mk |
07 |
LOCAL_SRC_FILES := $(FFFILES) |
15 |
LOCAL_CFLAGS += $(FFCFLAGS) |
17 |
LOCAL_CFLAGS += -include "string.h" -Dipv6mr_interface=ipv6mr_ifindex |
21 |
LOCAL_STATIC_LIBRARIES := $(FFLIBS) |
23 |
LOCAL_MODULE := $(FFNAME) |
25 |
include $(BUILD_STATIC_LIBRARY) |
(6)~/lplayer/jni/ffmpeg/libavfilter/Android.mk
01 |
LOCAL_PATH := $(call my- dir ) |
05 |
include $(LOCAL_PATH)/../av.mk |
07 |
LOCAL_SRC_FILES := $(FFFILES) |
15 |
LOCAL_CFLAGS += $(FFCFLAGS) |
17 |
LOCAL_STATIC_LIBRARIES := $(FFLIBS) |
19 |
LOCAL_MODULE := $(FFNAME) |
21 |
include $(BUILD_STATIC_LIBRARY) |
(7)~/lplayer/jni/ffmpeg/libavutil/Android.mk
01 |
LOCAL_PATH := $(call my- dir ) |
05 |
include $(LOCAL_PATH)/../av.mk |
07 |
LOCAL_SRC_FILES := $(FFFILES) |
15 |
LOCAL_CFLAGS += $(FFCFLAGS) |
17 |
LOCAL_STATIC_LIBRARIES := $(FFLIBS) |
19 |
LOCAL_MODULE := $(FFNAME) |
21 |
include $(BUILD_STATIC_LIBRARY) |
(8)、~/lplayer/jni/ffmpeg/libpostproc/Android.mk
01 |
LOCAL_PATH := $(call my- dir ) |
05 |
include $(LOCAL_PATH)/../av.mk |
07 |
LOCAL_SRC_FILES := $(FFFILES) |
15 |
LOCAL_CFLAGS += $(FFCFLAGS) |
17 |
LOCAL_STATIC_LIBRARIES := $(FFLIBS) |
19 |
LOCAL_MODULE := $(FFNAME) |
21 |
include $(BUILD_STATIC_LIBRARY) |
(9)、~/lplayer/jni/ffmpeg/libswscale/Android.mk
01 |
LOCAL_PATH := $(call my- dir ) |
05 |
include $(LOCAL_PATH)/../av.mk |
07 |
LOCAL_SRC_FILES := $(FFFILES) |
15 |
LOCAL_CFLAGS += $(FFCFLAGS) |
17 |
LOCAL_STATIC_LIBRARIES := $(FFLIBS) |
19 |
LOCAL_MODULE := $(FFNAME) |
21 |
include $(BUILD_STATIC_LIBRARY) |
5.4、配置ffmpeg
(1)编写配置脚本:~/lpayer/jni/ffmpeg/config.sh
注意其中的NDK路径,请修改成你系统中对应的安装路径
05 |
PREBUILT=/home/long/androiddev/android-ndk-r8b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86 |
07 |
PLATFORM=/home/long/androiddev/android-ndk-r8b/platforms/android-9/arch-arm |
11 |
./configure --target-os=linux \ |