如何在 Android 中录制屏幕内容,并以H.264数据流形式发送(屏幕广播)
这是一个不太常见的需求,因为博主本人所在公司是做教育相关产品的,故而有此需求,通过录制学生端pad屏幕,进行屏幕广播,本文主要介绍其中需要注意的一些关键点,详细代码可以在文末的 Github 仓库中查看。
1. 权限申请
不同于普通的动态权限申请,屏幕录制的权限在每次使用 App 时都需要重新申请一次。
object Utils {
const val REQUEST_MEDIA_PROJECTION = 1
/**
* 申请录屏权限
*/
fun createPermission(activity: Activity) {
val mediaProjectionManager =
activity.application.getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
val intent = mediaProjectionManager.createScreenCaptureIntent()
activity.startActivityForResult(intent, REQUEST_MEDIA_PROJECTION)
}
}
在 onActivityResult
回调中保存 resultCode
与 data
,这两个参数将会在后续用于实例化 MediaProjection
对象
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
//授权成功,保存intent,在后续需要使用该intent申请相关屏幕录制的对象
if (requestCode == Utils.REQUEST_MEDIA_PROJECTION) {
if (resultCode == Activity.RESULT_OK) {
//保存intent
GlobalConfig.intent = data!!
}
}
}
2. 创建 MediaCodec 编码器
mMediaCodecEncoder = MediaCodec.createEncoderByType("video/avc") // H.264编码格式
//配置编码器
val mediaFormat = Utils.getMediaFormat()
mMediaCodecEncoder.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
//该surface用于下一步中创建VirtualDisplay
surface = mMediaCodecEncoder.createInputSurface()
mMediaCodecEncoder.start()
3. 创建虚拟显示器 VirtualDisplay
GlobalConfig.intent?.let</