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

本文详细介绍了如何在Android环境中集成FFmpeg库,并通过修改ffmpeg.c文件实现图片与音频的合成功能。作者分享了从下载NDK到修改源码的具体步骤,并解决了编译过程中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

拿到编译好的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值