因为项目需要将图片合成视频并添加水印,滤镜和背景音乐的功能,在Github上面找到一个开源项目EpMedia是满符合要求的。EpMedia是基于FFmpeg,而图片合成视频的预览播放能力是使用ijkplayer,因此就将两者结合,生成了一个新的EpMedia库,将其命名为EpMediaCreator。
EpMedia Github地址
https://github.com/yangjie10930/EpMedia
Android上基于FFmpeg开发的视频处理框架,简单易用,体积小,帮助使用者快速实现视频处理功能。包含以下功能:剪辑,裁剪,旋转,镜像,合并,分离,变速,添加LOGO,添加滤镜,添加背景音乐,加速减速视频,倒放音视频。
本项目所使用的EpMedia在开源项目EpMedia的基础上,依赖ijkplayer而形成。因此在编译本库时,先确保已经生成了ijkplayer的相关库。
首先,修改Android.mk,
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libijkffmpeg
LOCAL_SRC_FILES := prebuilt/libijkffmpeg.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libijkplayer
LOCAL_SRC_FILES := prebuilt/libijkplayer.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libijksdl
LOCAL_SRC_FILES := prebuilt/libijksdl.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := ffmpeg_jni
LOCAL_SRC_FILES := Jni_FFmpegCmd.c\
cmdutils.c \
ffmpeg.c \
ffmpeg_opt.c \
ffmpeg_filter.c \
ffmpeg_thread.c
LOCAL_C_INCLUDES := $(ANDROID_NDK)/platforms/android-21/arch-arm/usr/include \
/Users/littlebyte/svn/trunk_CloudCommonLib/EpMediaCreator/src/main/jni/include \
/Users/littlebyte/develop/ijkplayer-android/extra/ffmpeg
LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid -lm -pthread -L$(SYSROOT)/usr/lib -latomic
LOCAL_SHARED_LIBRARIES := libijkffmpeg libijkplayer libijcdksdl
LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS -Wno-sign-compare -Wno-switch -Wno-pointer-sign -DHAVE_NEON=1 -fPIC -DANDROID
include $(BUILD_SHARED_LIBRARY)
其中,LOCAL_C_INCLUDES需要修改为自己的电脑的目录,分别是ANDROID_NDK下的include目录,EpMediaCreator jni下的include目录,以及本机的ffmpeg源码目录。
下面是EpMediaCreator的so库生成脚本。
# epmedia so 生成脚本
# ps. EpMediaCreator模块只作为so库生成,不实际参与编译使用,也不打包到apk
#(!!!使用时请修改为本机的ijkplayer源码路径)
IJKPLAYER_HOME=/Users/littlebyte/develop/ijkplayer-android
PROJECT_ROOT=$PWD
#ijkplayer编译完成后,在对应cpu目录下(如:ijkplayer-armv7a)生成so库
cd $PROJECT_ROOT/src/main/
rm jni/prebuilt/*
#将ijkplayer的so库复制到prebuilt目录下
cp $IJKPLAYER_HOME/android/ijkplayer/ijkplayer-armv7a/src/main/libs/armeabi-v7a/*.so jni/prebuilt
#移除之前生成的so库
rm -r obj
rm libs/armeabi-v7a/*
cd jni
ndk-build
echo "make success!!"
然后进入生成脚本所在目录,运行脚本,如果一切顺利则可以生成下图的libffmpeg_jni.so库,就可以使用它替代Epmedia里面的原本的libffmpeg_jni.so库了。
ps. ijkplayer的编译配置见上一篇文章:ijkplayer 编译备忘,支持x264和https。