Android移植ffmpeg.so实现屏幕录制功能(下)

      由于赶项目原因耽误了段时间才更新,忽然发现人的记忆真是经不起时间的折腾,哎。。话不多说,接上篇!

拿到编译好的ffmpeg.so文件,就可以使用里面的函数方法进行做屏幕录制的操作,但是经过查找和询问,发现ffmpeg在android设备上不支持屏幕录制,但是可以实现图片和音频合成,但是我对ffmpeg函数不熟悉,于是又到网络搜索一番,发现一篇文章给的提示:  http://bbs.rg4.net/thread-13410-1-1.html

把ffmpeg.c的main函数该函数接口,用命令来实现我的所有需要的功能,类似,如果没有用过的朋友可以到网上去寻找ffmpeg.exe文件在windows系统下用dos测试使用,附上ffmpeg.exe下载地址:http://download.csdn.net/detail/liu8297036/6766189 

   下面介绍更改ffmpeg.c接口实现步骤:

1,现在开始要转换到windows下的eclipse实现编译,首先要先去官网下载NDK http://developer.android.com/tools/sdk/ndk/index.html (注意 这次是windows下的版本 我的是android-ndk-r9-windows-x86版本)

把linux下的hello-jni项目导入到eclipse中.

2,在jni目录下建立一个Android.mk文件(把之前的Android.mk文件删掉,或者重命名),内容如下:

LOCAL_PATH := $(call my-dir)  

include $(CLEAR_VARS)  
 PATH_TO_FFMPEG_SOURCE:=$(LOCAL_PATH)/ffmpeg  
LOCAL_C_INCLUDES += $(PATH_TO_FFMPEG_SOURCE)   
 LOCAL_LDLIBS := -lffmpeg -ljnigraphics -lz -ldl -lgcc  -llog
 LOCAL_MODULE    := ffmpeg-test  
 LOCAL_SRC_FILES := ffmpeg-test.c ffmpeg/cmdutils.h ffmpeg/cmdutils.c ffmpeg/ffmpeg.h ffmpeg/ffmpeg_opt.c ffmpeg/ffmpeg_filter.c 
  
include $(BUILD_SHARED_LIBRARY)  
如果你想 在指定的系统版本或指定ABI生成机器代码可以加入Application.mk  内容如下:
//比如:为了在ARMv7的设备上支持硬件FPU指令。可以使用
APP_ABI := armeabi-v7a

//或者为了支持IA-32指令集,可以使用
//APP_ABI := x86

//或者为了同时支持这三种,可以使用
//APP_ABI := armeabi armeabi-v7a x86
//APP_PLATFORM := android-9 指定系统版本
3,将linux下编译好的ffmpeg.so文件放进ffmpeg源码文件夹中,然后再jni根目录创建一个ffmpeg-test.c的文件,内容是源码中ffmpeg.c的内容,然后找到 int main(int argc, char **argv) 函数将其改名为ffmpeg_utils函数,然后在末尾在增加一个jni接口,内容如下:

int
Java_com_example_hellojni_HelloJni_utilsFromJni(JNIEnv* env,jobject thiz,jstring jpgPath,jstring audioPath,jstring fileName){
int a = 16;
char *arg[16];
arg[0] = "ffmpeg";
arg[1] = "-i";
arg[2] = jstringTostring(env,jpgPath);
arg[3] = "-i";
arg[4] = jstringTostring(env,audioPath);
arg[5] = "-qscale";
arg[6] = "1";
arg[7] = "-r";
arg[8] = "24";
arg[9] = "-vcodec";
arg[10] = "copy";
arg[11] = "-acodec";
arg[12] = "copy";
arg[13] = "-vcodec";
arg[14] = "mpeg4";
arg[15] = jstringTostring(env,fileName);
int ret = ffmpeg_utils(a,arg);
return ret;
}

接下来在集成ndk的eclipse中编译后运行,然后会在libs文件夹中出现一个ffmpeg-test.so。 然后你就可以使用ffmpeg的命令功能了。


最后在android上开个线程截取当前屏幕view保存成图片,然后再把图片和录音路径传给jni接口,就可以实现android屏幕录制功能!


下面我介绍在编译过程中遇到的问题: 

在getutime函数中说没有定义struct rusage数据结构。storage size of 'rusage' isn't known
解决办法:在头文件找到

#if HAVE_SYS_RESOURCE_H
#include <sys/time.h>
#include <sys/types.h>
#include <sys/resource.h>
#elif HAVE_GETPROCESSTIMES

把#include <sys/resource.h> #include <sys/time.h> 放在if语句外面就可以了。顺便在cmdutils.c文件中,也把这两个头文件引进来。。



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值