之前寫了FFmpeg的編譯過程冕香,那么編譯之后,就是用來實際的開發(fā)了后豫,開發(fā)之前悉尾,首先要把FFmpeg的lib和include集成到我們的項目。這一篇主要介紹如何集成到Android項目挫酿。
1构眯、新建Android工程
這個就不用說了吧......
2、創(chuàng)建JNI Folder
不知道怎么創(chuàng)建的我的另外一篇文章Android JNI之HelloWorld ,這里我們修改一下路徑:
我這里的路徑為:app/jnicode/jni
3早龟、在jincode下新建一個prebuilt文件夾惫霸,把編譯出來的文件拷貝進來:
如上圖所示猫缭,我這里說明一下:
- prebuilt :存放FFmpeg的頭文件。
- jni:存放的是自己的C/C++代碼
- arm32:32位處理器的libs
- arm64 : 64位處理器的libs
- autobuild.sh : 自動編譯的腳本
- autojavah.sh : 自動把Java文件轉(zhuǎn)換為頭文件的腳本
4壹店、編寫自己的mk文件:
我們這里以32位架構(gòu)處理器來說明猜丹,大家都知道,要使用mk文件編譯一個文件硅卢,需要放置在jni文件夾下(不知道這樣表述是否正確射窒,目前接觸到的都是這樣的),所以在arm32下新建一個jni目錄将塑,還是上個圖吧脉顿,比照著圖片來說,更詳細一些点寥。
ps:不知道為什么截的圖越小弊予,圖片就被放的很大,反倒是截的圖片大了顯示的很小开财,好郁悶汉柒。。责鳍。碾褂。。历葛。
- libs :放置ffmpeg的so文件
- Android.mk
- Application.mk
與jni平級的兩個目錄是編譯的時候自動生成的正塌。還有兩個mk文件,就不用我解釋了吧恤溶。
這里主要看一下Android.mk文件里面的內(nèi)容
LOCAL_PATH:= $(call my-dir) #指定當前目錄
PRE_BUILD_PATH:= $(LOCAL_PATH)/../../prebuilt #指定FFmpeg的頭文件目錄
MY_SRC_PATH:=$(LOCAL_PATH)/../../jni #指定自己的C代碼路徑
#************************libavcodec********************************/
include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= libs/libavcodec-57.so
LOCAL_EXPORT_C_INCLUDES := $(PRE_BUILD_PATH)/libffmpeg/libavcodec
include $(PREBUILT_SHARED_LIBRARY)
#************************libavformat********************************/
include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= libs/libavformat-57.so
LOCAL_EXPORT_C_INCLUDES := $(PRE_BUILD_PATH)/libffmpeg/libavformat
include $(PREBUILT_SHARED_LIBRARY)
#************************libswscale********************************/
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= libs/libswscale-4.so
LOCAL_EXPORT_C_INCLUDES := $(PRE_BUILD_PATH)/libffmpeg/libswscale
include $(PREBUILT_SHARED_LIBRARY)
#************************libavutil********************************/
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= libs/libavutil-55.so
LOCAL_EXPORT_C_INCLUDES := $(PRE_BUILD_PATH)/libffmpeg/libavutil
include $(PREBUILT_SHARED_LIBRARY)
#************************libavfilter********************************/
include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= libs/libavfilter-6.so
LOCAL_EXPORT_C_INCLUDES := $(PRE_BUILD_PATH)/libffmpeg/libavfilter
include $(PREBUILT_SHARED_LIBRARY)
#************************libavfilter********************************/
include $(CLEAR_VARS)
LOCAL_MODULE:= libpostproc
LOCAL_SRC_FILES:= libs/libpostproc-54.so
LOCAL_EXPORT_C_INCLUDES := $(PRE_BUILD_PATH)/libffmpeg/libpostproc
include $(PREBUILT_SHARED_LIBRARY)
#************************libswresample********************************/
include $(CLEAR_VARS)
LOCAL_MODULE:= libswresample
LOCAL_SRC_FILES:= libs/libswresample-2.so
LOCAL_EXPORT_C_INCLUDES := $(PRE_BUILD_PATH)/libffmpeg/libswresample
include $(PREBUILT_SHARED_LIBRARY)
#************************libx264********************************/
include $(CLEAR_VARS)
LOCAL_MODULE:= libx264
LOCAL_SRC_FILES:= libs/libx264.a
LOCAL_EXPORT_C_INCLUDES := $(PRE_BUILD_PATH)/libffmpeg/libx264
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := playerCore #指定自己的so文件名稱
#需要編譯的自己的C文件
LOCAL_SRC_FILES:= $(MY_SRC_PATH)/org_eson_ffmpeg_libs_PlayerCore.cpp \
LOCAL_LDLIBS += -llog -ljnigraphics -lz -landroid -lOpenSLES -g
#引入FFmpeg,這個如果不添加乓诽,編譯時會報錯
LOCAL_SHARED_LIBRARIES := libavcodec libavformat libswscale libavutil libavfilter libswresample
include $(BUILD_SHARED_LIBRARY)
其實,這里的libx264是可以不用要的咒程,我這里也添加上了鸠天。可以自行忽略帐姻。至于Application.mk 的內(nèi)容稠集,這里就貼出來了。
5饥瓷、修改FFmpeg的頭文件
這里先說一下為什么要修改
1剥纷、作為一個Java程序員,習慣用代碼的自動提示呢铆,如果不修改晦鞋,在寫的時候,不能自動提示,感覺好郁悶悠垛,也可以說是自己的技術(shù)還很渣吼砂,嚴重依賴代碼的提示。(畢竟自動提示寫代碼很快鼎文,但還是需要改改,這里記一下以后再寫代碼的時候能不用就不用因俐,對自己提高有幫助)
2拇惋、編譯64位時會報錯
解決方法:
1、修改頭文件的引用路徑(以libavcodec/avcodec.h為例):
將
#include "libavutil/samplefmt.h"
#include "libavutil/attributes.h"
#include "libavutil/avutil.h"
#include "libavutil/buffer.h"
#include "libavutil/cpu.h"
#include "libavutil/channel_layout.h"
#include "libavutil/dict.h"
#include "libavutil/frame.h"
#include "libavutil/log.h"
#include "libavutil/pixfmt.h"
#include "libavutil/rational.h"
改為:
#include "../libavutil/samplefmt.h"
#include "../libavutil/attributes.h"
#include "../libavutil/avutil.h"
#include "../libavutil/buffer.h"
#include "../libavutil/cpu.h"
#include "../libavutil/channel_layout.h"
#include "../libavutil/dict.h"
#include "../libavutil/frame.h"
#include "../libavutil/log.h"
#include "../libavutil/pixfmt.h"
#include "../libavutil/rational.h"
以自己的路徑為準抹剩,我這里只是參考撑帖。
2、在編譯64位時libutils/common.h會報錯澳眷,如果 common.h 報錯
在最上面添加以下代碼
#ifndef UINT64_C
#define UINT64_C(value)__CONCAT(value,ULL)
#endif
總結(jié)
FFmpeg的編譯和集成到這里就結(jié)束了胡嘿,后續(xù)有可能更新具體的實現(xiàn)某些功能,有時間在更新吧钳踊。
疑問
關(guān)于同時編譯出64位和32位架構(gòu)的so庫時衷敌,感覺現(xiàn)在模式比較麻煩,不知道還能不能優(yōu)化拓瞪,希望有大神看到指點一下缴罗。感謝!