fly 72249635c1 move code 5 months ago
..
App2 72249635c1 move code 5 months ago
App2.Android 72249635c1 move code 5 months ago
App2.sln 72249635c1 move code 5 months ago
README.md 72249635c1 move code 5 months ago

README.md

demo使用说明

本项目用于安卓获取屏幕内容,后续可能会基于此继续开发用于推流的工作

主要逻辑

方式一:通过连续性截取屏幕的方式,不断将截图缓存在内存中,结束的时候内存中图像数据写入磁盘 方式一目前验证下来有个缺陷:无法截取到Android原生的画面(探头画面),故方式一暂时不用

方式二:通过屏幕录制,通过不断获取屏幕录制的缓冲区中的图像,来实现连续的截图

主要实现类(ScreenshotService)

在Xamarin项目中有接口定义IScreenshotService 在Android项目中实现IScreenshotService,Android启动时需注册此Service,代码如下: DependencyService.Register<IScreenshotService, ScreenshotService>(); Xamarin项目获取这个Service的代码是: var service = DependencyService.Get<IScreenshotService>();

主要方法

service = DependencyService.Get<IScreenshotService>(); service.Init();//这个Init不可少,全局调用一次即可,用来初始化一些必要的前提条件

截取当前屏幕的单帧图像的方法(Capture): byte[] imageBytes = await DependencyService.Get<IScreenshotService>().Capture(); 返回值是当前屏幕的一帧截图的数据 连续截图的方法是通过不断调用这个Capture方法实现的,目前测下来的速度是每秒5——10帧

其他方法介绍

string GetExternalStorage() : 获取app的缓存目录,目前获取的路径统一为:/storage/emulated/0/Android/data/com.companyname.app2/files

void WriteLog(string text) :写日志,日志文件的路径使用GetExternalStorage()返回的路径

void StartScreenRecording() : 开启屏幕录制,这个方法目前还没实现完,Capture这个方法效率可能不太够,所以想通过这个录制的方法获取屏幕实时的数据,然后转成视频流推出去

如何测试

清先清理安卓设备这个目录下所有的缓存图片:/storage/emulated/0/Android/data/com.companyname.app2/files 项目运行后,在页面上点击START按钮,10秒左右后点击END按钮 然后在这个路径下查看生成了多少张图像:/storage/emulated/0/Android/data/com.companyname.app2/files 注意:UI上显示的帧率其实是理想的帧率,但是实际上是达不到的,需要自己使用图像数量/时间自己算一下

如何集成到其他项目

1.将ScreenshotService复制进新Android项目,将IScreenshotService放入Xamarin项目 2.Android启动时需注册此Service,代码如下: DependencyService.Register<IScreenshotService, ScreenshotService>(); 3.在Xamarin项目中初始化ScreenshotService: service = DependencyService.Get<IScreenshotService>(); service.Init(); 4.通过多次调用Capture获取屏幕截图数据(多次调用可参考Demo中的TimerCallback方法) byte[] imageBytes = await DependencyService.Get<IScreenshotService>().Capture();