文章目录
前言
最近在做录屏相关的项目,学习过程中记录的笔记如下,方便日后回顾。
实现
实现方案
方案一:MediaCodec录制
概述
- 录制我们在另外一个线程中进行(录制现场),所以录制的EGL环境和显示的EGL环境(
GLSurfaceView
,显示线程)是两个独立的工作环境,他们又能够共享上下文资源:显示线程中使用的texture等,需要能够在录制线程中操作(通过录制线程中使用OpenGL绘制到MediaCodec的Surface)。 - 因为是直接硬编码的H264,比起一般使用ffmpng的软编码效率要高不少,但是有个非常致命的缺点,无法设置fps。
- MediaCodec有个
MediaFormat.KEY_FRAME_RATE
参数,它可以设置fps,但是我发现我不管设置什么最终读出的fps都是25帧。 - OpenGL整体是一个状态机,通过改变状态就能改变后续的渲染方式,而
EGLContext(EgL上下文)就保存有所有状态,因此可以通过共享EGLContext
来实现同一场景渲染到不同的Surface上。
博客
-
android openGl录制音视频
https://blog.youkuaiyun.com/gan303/article/details/106620913
一个demo,并没有详细的解析。
-
Android 仿抖音之使用OpenGL实现抖音视频录制
https://www.jianshu.com/p/357cc096cd15
博客,没有源码,只是对实现进行解析。两个gl环境,一个glsurfacce录制,录像的opengl。能否将视频录制放到绘制线程中?
-
Android 关于美颜/滤镜 从OpenGl录制视频的一种方案
-
Android MP4视频录制(思路篇,无DEMO)
-
Android OpenGL添加水印并录制视频–抖音视频录制原理
https://blog.youkuaiyun.com/CSqingchen/article/details/105492716
-
OpenGLES渲染画面通过MediaCodec录制
-
Android OpenGL ES(五)-结合相机进行预览/录制及添加滤镜
方案二:GLES20.glReadPixels()
概述
- OpenGL方法,用于读取像素,但我测试过只有在索尼或者三星的手机上效率可以,在国产的机子上效率低的可以差不多接近100ms,这是完全不可接受的。
方案三:PBO
概述
- PBO的确可以实现跟ImageReader一样的效果,并且版本要求仅为Android4.3。
方案四: ImageReader
概述
-
跟MediaCodec创建Surface的方式一模一样,唯一不同的就是MediaCodec录制出来的是H264,而ImageReader拿出来的是BGRA的,用《Android ImageReader使用》的话说就是**ImageReader类允许应用程序直接访问呈现表面的图像数据 **
-
ImageReader首先要求4.4及以上(稍微有点瑕疵,但是现在4.4以下的机子应该比较少了),并且拿出来的是BGRA的(跟Bitmap的ARGB_8888是不一样的,这里要注意),而且在使用过程中要注意内存对齐的问题。
-
1280x1080那这效率还是远远跟不上的。
相关技术
MediaCodec
概述
-
Android多媒体–MediaCodec 中文API文档
文档有点长,暂未看完。
-
MediaCodec的使用介绍
-
十分钟完成安卓MediaCodec视频解码
https://blog.youkuaiyun.com/u014653815/article/details/81084161
MediaMuxer
概述
根据数据源合成视频文件
相关博客
-
Android音视频处理之MediaMuxer
问题
- texture id是怎样与media关联的。
- 停止录像是否能够立即停止
- Q71录像会导致卡顿,Q60是否有相同的现象?
- 加锁是否对滤镜有影响。
- 自己写一个录像demo,查找原因。