文档章节

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

DB_Terrill
 DB_Terrill
发布于 2017/04/21 09:52
字数 849
阅读 75
收藏 0

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

拿到编译好的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文件中,也把这两个头文件引进来。。

本文转载自:http://blog.sina.com.cn/s/blog_12eb15b660102v87n.html

DB_Terrill
粉丝 26
博文 149
码字总数 29396
作品 0
大连
其他
私信 提问
Android Camera模块解析之视频录制

《Android Camera架构》 《Android Camera进程间通信类总结》 《Android Camera模块解析之拍照》 《Android Camera模块解析之视频录制》 《Android Camera原理之CameraDeviceCallbacks回调模...

天王盖地虎626
06/18
33
0
深入探讨 Android 传感器

Android 是一个面向应用程序开发的富平台,它拥有许多具有吸引力的用户界面元素和数据管理功能。Android 还提供了一组丰富的接口选项。在本文中,学习如何配合使用 Android 的各种传感器选项...

红薯
2009/07/20
8K
9
期待:Android新版SDK随Cupcake 4月现身

近期Google将会对所有的Android开发人员推出新版的SDK以适应cupcake更新的需要,比较激动人心的功能有以下地方: IMF框架已经在Cupcake上完成了,Android平台将会得到屏幕键盘的支持,这样开发...

电子商务
2009/04/14
268
0
几维安全APP安全加固率先实现Android Q Beta兼容支持

日前,谷歌官宣,Android最新版本——Android Q Beta正式对外发布,几维安全第一时间追踪Android系统技术动态,对APP安全加固进行技术攻关和产品升级适配,实现兼容支持。 本次谷歌发布的And...

工作的事
04/01
62
0
《视频直播技术详解》系列之一:视频采集和处理

直播中的各个环节: 1.采集 采集是播放环节中的第一环,iOS 系统因为软硬件种类不多,硬件适配性较好,所以比较简单。Android 则不同,市面上硬件机型非常多,难以做到一个库适配所有硬件。P...

ljianbing
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
10
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
1K
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部