Android OpglEs录屏功能实现

前言

最近在做录屏相关的项目,学习过程中记录的笔记如下,方便日后回顾。

实现

实现方案

方案一:MediaCodec录制

概述
  1. 录制我们在另外一个线程中进行(录制现场),所以录制的EGL环境和显示的EGL环境(GLSurfaceView,显示线程)是两个独立的工作环境,他们又能够共享上下文资源:显示线程中使用的texture等,需要能够在录制线程中操作(通过录制线程中使用OpenGL绘制到MediaCodec的Surface)。
  2. 因为是直接硬编码的H264,比起一般使用ffmpng的软编码效率要高不少,但是有个非常致命的缺点,无法设置fps。
  3. MediaCodec有个MediaFormat.KEY_FRAME_RATE参数,它可以设置fps,但是我发现我不管设置什么最终读出的fps都是25帧。
  4. OpenGL整体是一个状态机,通过改变状态就能改变后续的渲染方式,而
    EGLContext(EgL上下文)就保存有所有状态,因此可以通过共享EGLContext
    来实现同一场景渲染到不同的Surface上。
博客

方案二:GLES20.glReadPixels()

概述
  1. OpenGL方法,用于读取像素,但我测试过只有在索尼或者三星的手机上效率可以,在国产的机子上效率低的可以差不多接近100ms,这是完全不可接受的。

方案三:PBO

概述
  1. PBO的确可以实现跟ImageReader一样的效果,并且版本要求仅为Android4.3。

方案四: ImageReader

概述
  1. 跟MediaCodec创建Surface的方式一模一样,唯一不同的就是MediaCodec录制出来的是H264,而ImageReader拿出来的是BGRA的,用《Android ImageReader使用》的话说就是**ImageReader类允许应用程序直接访问呈现表面的图像数据 **

  2. ImageReader首先要求4.4及以上(稍微有点瑕疵,但是现在4.4以下的机子应该比较少了),并且拿出来的是BGRA的(跟Bitmap的ARGB_8888是不一样的,这里要注意),而且在使用过程中要注意内存对齐的问题。

  3. 1280x1080那这效率还是远远跟不上的。

相关技术

MediaCodec

概述

文档有点长,暂未看完。

MediaMuxer

概述

根据数据源合成视频文件

相关博客

问题

  1. texture id是怎样与media关联的。
  2. 停止录像是否能够立即停止
  3. Q71录像会导致卡顿,Q60是否有相同的现象?
  4. 加锁是否对滤镜有影响。
  5. 自己写一个录像demo,查找原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈德山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值