FFmpeg实战--项目的集成

之前写了FFmpeg的编译过程,那么编译之后,就是用来实际的开发了,开发之前,首先要把FFmpeg的lib和include集成到我们的项目。这一篇主要介绍如何集成到Android项目。

1、新建Android工程

这个就不用说了吧......

2、创建JNI Folder

不知道怎么创建的我的另外一篇文章Android JNI之HelloWorld ,这里我们修改一下路径:

QQ2016091.png

我这里的路径为:app/jnicode/jni

3、在jincode下新建一个prebuilt文件夹,把编译出来的文件拷贝进来:
屏幕快照 2016-09-14 16.14.28.png

如上图所示,我这里说明一下:

  • prebuilt :存放FFmpeg的头文件。
  • jni:存放的是自己的C/C++代码
  • arm32:32位处理器的libs
  • arm64 : 64位处理器的libs
  • autobuild.sh : 自动编译的脚本
  • autojavah.sh : 自动把Java文件转换为头文件的脚本
4、编写自己的mk文件:

我们这里以32位架构处理器来说明,大家都知道,要使用mk文件编译一个文件,需要放置在jni文件夹下(不知道这样表述是否正确,目前接触到的都是这样的),所以在arm32下新建一个jni目录,还是上个图吧,比照着图片来说,更详细一些。

屏幕快照 2016-09-14 16.48.47.png

ps:不知道为什么截的图越小,图片就被放的很大,反倒是截的图片大了显示的很小,好郁闷。。。。。。

  • libs :放置ffmpeg的so文件
  • Android.mk
  • Application.mk

与jni平级的两个目录是编译的时候自动生成的。还有两个mk文件,就不用我解释了吧。

这里主要看一下Android.mk文件里面的内容

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 的内容,这里就贴出来了。

5、修改FFmpeg的头文件

这里先说一下为什么要修改
1、作为一个Java程序员,习惯用代码的自动提示,如果不修改,在写的时候,不能自动提示,感觉好郁闷,也可以说是自己的技术还很渣,严重依赖代码的提示。(毕竟自动提示写代码很快,但还是需要改改,这里记一下以后再写代码的时候能不用就不用,对自己提高有帮助)
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
总结

FFmpeg的编译和集成到这里就结束了,后续有可能更新具体的实现某些功能,有时间在更新吧。

疑问

关于同时编译出64位和32位架构的so库时,感觉现在模式比较麻烦,不知道还能不能优化,希望有大神看到指点一下。感谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容