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文件删掉,或者重命名),内容如下:

 

[html] view plaincopy

  1. LOCAL_PATH := $(call my-dir)    
  2.   
  3. include $(CLEAR_VARS)    
  4.  PATH_TO_FFMPEG_SOURCE:=$(LOCAL_PATH)/ffmpeg    
  5. LOCAL_C_INCLUDES += $(PATH_TO_FFMPEG_SOURCE)     
  6.  LOCAL_LDLIBS := -lffmpeg -ljnigraphics -lz -ldl -lgcc  -llog  
  7.  LOCAL_MODULE    := ffmpeg-test    
  8.  LOCAL_SRC_FILES := ffmpeg-test<</span>span style="font-family: 'Microsoft YaHei';">.c ffmpeg/cmdutils.h ffmpeg/cmdutils.c ffmpeg/ffmpeg.h ffmpeg/ffmpeg_opt.c ffmpeg/ffmpeg_filter.c </</span>span>  
  9.     
  10. include $(BUILD_SHARED_LIBRARY)    

如果你想在指定的系统版本或指定ABI生成机器代码可以加入Application.mk  内容如下:

[html] view plaincopy

  1. //比如:为了在ARMv7的设备上支持硬件FPU指令。可以使用  
  2. APP_ABI := armeabi-v7a  
  3.   
  4. //或者为了支持IA-32指令集,可以使用  
  5. //APP_ABI := x86  
  6.   
  7. //或者为了同时支持这三种,可以使用  
  8. //APP_ABI := armeabi armeabi-v7a x86  
  9. //APP_PLATFORM := android-9 指定系统版本  

3,将linux下编译好的ffmpeg.so文件放进ffmpeg源码文件夹中,然后再jni根目录创建一个ffmpeg-test.c的文件,内容是源码中ffmpeg.c的内容,然后找到int main(int argc, char **argv)函数将其改名为ffmpeg_utils函数,然后在末尾在增加一个jni接口,内容如下:

 

 

[html] view plaincopy

  1. int  
  2. Java_com_example_hellojni_HelloJni_utilsFromJni(JNIEnv* env,jobject thiz,jstring jpgPath,jstring audioPath,jstring fileName){  
  3. <</span>span style="white-space:pre">int a = 16;  
  4. char *arg[16];  
  5. arg[0] = "ffmpeg";  
  6. arg[1] = "-i";  
  7. arg[2] = jstringTostring(env,jpgPath);  
  8. arg[3] = "-i";  
  9. arg[4] = jstringTostring(env,audioPath);  
  10. arg[5] = "-qscale";  
  11. arg[6] = "1";  
  12. arg[7] = "-r";  
  13. arg[8] = "24";  
  14. arg[9] = "-vcodec";  
  15. arg[10] = "copy";  
  16. arg[11] = "-acodec";  
  17. arg[12] = "copy";  
  18. arg[13] = "-vcodec";  
  19. arg[14] = "mpeg4";  
  20. arg[15] = jstringTostring(env,fileName);  
  21. int ret = ffmpeg_utils(a,arg);  
  22. return ret;  
  23. }</</span>span>  


接下来在集成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 
#include 
#include 
#elif HAVE_GETPROCESSTIMES

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

转载于:https://my.oschina.net/yuyang/blog/884137

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AndroidFFmpeg.so是一个用于处理音视频的开源库。它提供了丰富的功能和接口,可以让开发者在Android平台上进行音视频的录制、转码、剪辑、编解码等操作。 首先,AndroidFFmpeg.so是FFmpeg项目的一部分,它是一个非常流行的开源音视频处理库。通过将FFmpeg的源代码编译成动态链接库,开发者可以在Android应用中调用其中的函数来实现各种音视频处理的功能。 其次,FFmpeg.so提供了丰富的功能接口。开发者可以使用它来进行音视频的录制和播放,实现各种常见的媒体格式的转码,还可以对音视频流进行剪辑、编辑和拼接等操作。同时,FFmpeg.so还支持多种音视频编解码格式,包括常见的MP3、AAC、H.264等,使开发者可以在Android平台上进行广泛的音视频处理工作。 此外,FFmpeg.so还具有跨平台的特性。由于FFmpeg是一个跨平台的项目,因此基于FFmpeg.so开发的功能Android平台上可以很容易地移植到其他平台上,比如iOS、Windows等。这样一来,开发者可以通过使用FFmpeg.so来实现跨平台的音视频处理需求,方便快捷地进行开发工作。 综上所述,AndroidFFmpeg.so是一个强大且功能丰富的音视频处理库,可以帮助开发者实现各种音视频处理的需求。通过使用FFmpeg.so,开发者可以在Android平台上进行音视频的录制、转码、剪辑、编解码等操作,同时还可以享受到跨平台开发的便利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值