基于MediaProjection+MediaCodec
(1)通过ImageReader创建Surface,获取图片后编码
存在的问题:只能获取RGBA格式的图片,不能直接进行编码,需要先转换【像素级数据转换在1080P下非常耗时,JAVA版和C语言版均要几十毫秒才行,基本不可行】
好处:可以逐张保存图片为Bitmap,实现截屏功能;可以自由的丢弃图片,控制提供给MediaCodec的图片速率,即帧率
(2)通过MediaCodec创建Surface直接编码
存在的问题:无法控制MediaCodec的输入输出帧率,动态画面时往往帧较高,不适合传输
(3)通过ImageReader创建Surface获取图片Bitmap,提供给MediaCodec创建的Surface进行编码
该方案综合了(1)、(2)两个方案的优点。建议采用。
(4)通过Jni获取数据后在C层编码
该方案是前3种方案的C层化,本质是一样的
1 | package com.encode.androidencode; |
1 | package com.interfaces.androidencode; |
1 | package com.encode.androidencode; |
1 | // |
基于MediaRecoder
MediaRecoder可直接将屏幕录制成文件,录屏过程比较简单。但是无法逐帧获取视频数据流进行网络传输,所以只适合本地录制,不适合网络传输相关场景。