Android屏幕镜像一:屏幕采集 + MediaCodec编码

Android屏幕镜像一:屏幕采集 + MediaCodec编码,第1张

接下来实现一个简单的Android屏幕镜像功能,主要涉及到以下这些知识点:

Android50 及更高版本支持屏幕采集,屏幕采集需要用动态申请权限。

如上,获取截屏权限后,就可以开始截屏了。

通过 MediaProjection 的 createVirtualDisplay 方法可将截屏画面给到指定的 surface 中,这里我们截屏的画面不需要显示,而是需要将画面数据给到 MediaCodec 编码,所以这里需要通过 MediaCodec 生成一个 surface 用于接收截屏数据。

接下来调用 MediaCodec 的 start 方法,就可以获取编码数据

由于是通过 surface 获取的编码数据,所以这里没有 onInputBufferAvailable 回调,只需监听 onOutputBufferAvailable 方法,就可以获得编码数据。 Android50 之后系统推荐使用这种通过异步获取编解码数据的方式,同时 Android50 之后系统也提供了同步获取编解码数据的方式。

Android50 之前的同步获取方式已经标记废弃了。

接下来可以在 encodeFrame 方法中处理 h264 数据

这里将数据回调给调用者处理,调用者可以储存为文件,也可以直接通过 socket 发送到服务器处理。

结束屏幕录制的时候要及时释放这些系统资源

屏幕的采集编码暂到这里,接下来我们要在本机完成解码显示。

获取了屏幕大小不就等于获取了坐标么。

Display My_Display=getWindow()getWindowManager()getDefaultDisplay();

int Max_X=My_DisplaygetWidth();

int Max_Y=My_DisplaygetHeight();

这个可以加入到方法中人后随时调用,也可以程序初始化的时候响应一次。

在Android中到处可见接口回调机制,尤其是UI事件处理方面,本文给大家介绍android接口回调机制,涉及到android接口回调相关知识,对本文感兴趣的朋友可以参考下本篇文章

在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的话你是无法和主函数同步的,也就是返回的数据是错误的,这是非常隐秘的一个错误。那有什么好的方法去实现数据的线性传递呢?先介绍下回调机制原理。

回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

开发中,接口回调是我们经常用到的。

接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行。

举个例子:

A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A可以继续先做别的事情。

那么就只有当B解决完问题后告诉A问题解决了,A才可以能解决这个问题。

代码中比如最常用的:

一个Activity中给按钮一个接口回调方法,只有用户点击了这个按钮,告诉按钮被点击了,才会执行按钮接口回调的方法

以上就是关于Android屏幕镜像一:屏幕采集 + MediaCodec编码全部的内容,包括:Android屏幕镜像一:屏幕采集 + MediaCodec编码、android手机屏幕最右下角坐标怎么获取,需要的是动态获取哈,好针对不同屏幕、Android动态加载调用方法时方法的参数里面带有接口,如何获取接口的回调等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10132570.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存