fly 72249635c1 move code | 5 months ago | |
---|---|---|
.. | ||
App2 | 5 months ago | |
App2.Android | 5 months ago | |
App2.sln | 5 months ago | |
README.md | 5 months ago |
本项目用于安卓获取屏幕内容,后续可能会基于此继续开发用于推流的工作
方式一:通过连续性截取屏幕的方式,不断将截图缓存在内存中,结束的时候内存中图像数据写入磁盘 方式一目前验证下来有个缺陷:无法截取到Android原生的画面(探头画面),故方式一暂时不用
方式二:通过屏幕录制,通过不断获取屏幕录制的缓冲区中的图像,来实现连续的截图
在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();