Android5.0视频录制--MediaProjection
Android在5.0系统之前,是没有开放视频录制的接口的,如果要录制视频,必须要先root,这部分我会在随后的博客中细讲。
在5.0,Google终于开放了视频录制的接口(其实严格来说,是屏幕采集的接口),也就是MediaProjection和MediaProjectionManager。
首先来说MediaProjectionManager,它是一个系统级的服务,类似WindowManager,AlarmManager等,你可以通过getSystemService方法来获取它的实例:
MediaProjectionManager mMediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
- 1
- 1
获取到实例后,录像的过程如下(有点像拍照的流程):
首先:
Intent captureIntent = mMediaProjectionManager.createScreenCaptureIntent();
startActivityForResult(captureIntent, REQUEST_CODE);
- 1
- 2
- 1
- 2
createScreenCaptureIntent方法的注释如下:
/*** Returns an Intent that <b>must</b> passed to startActivityForResult()* in order to start screen capture. The activity will prompt* the user whether to allow screen capture. The result of this* activity should be passed to getMediaProjection.*/
大致意思是,这个方法会返回一个intent,你可以通过startActivityForResult方法来传递这个intent,为了能开始屏幕捕捉,activity会提示用户是否允许屏幕捕捉(为了防止开发者做一个木马,来捕获用户私人信息),你可以通过getMediaProjection来获取屏幕捕捉的结果。
createScreenCaptureIntent的代码我们可以看一下:
public Intent createScreenCaptureIntent() {Intent i = new Intent();i.setClassName("com.android.systemui",
"com.android.systemui.media.MediaProjectionPermissionActivity");return i;}
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
看着很眼熟是吧,拍照的是这样:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 调用系统自带照相机
startActivityForResult(intent, REQUEST_CODE_LAUNCHCAMERA);
- 1
- 2
- 1
- 2
所以这里是创建了一个隐式的intent,用来调用系统的录屏程序。
然后正如上面的注释所说,我们通过startActivityForResult来传递这个intent,所以我们可以通过onActivityResult来获取结果,通过getMediaProjection来取出intent中的数据:
@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode != PERMISSION_CODE) {Log.e(TAG, "Unknown request code: " + requestCode);return;}if (resultCode != RESULT_OK) {Toast.makeText(this,"User denied screen sharing permission", Toast.LENGTH_SHORT).show();return;}mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);mMediaProjection.registerCallback(new MediaProjectionCallback(), null);mVirtualDisplay = createVirtualDisplay();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
我们通过getMediaProjection获取到mediaProjection,并注册了一个callback回调。
看看createVirtualDisplay做了什么:
private VirtualDisplay createVirtualDisplay() {return mMediaProjection.createVirtualDisplay("ScreenSharingDemo",mDisplayWidth, mDisplayHeight, mScreenDensity,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mSurface, null /*Callbacks*/, null /*Handler*/);}
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
可以看到,我们调用了MediaProjection的createVirtualDisplay方法,来创建了一个VirtualDisplay的实例,说几个createVirtualDisplay的参数含义:
name 是生成的VirtualDisplay实例的名称;
width和height分别是生成实例的宽高,必须大于0;
dpi,生成实例的像素密度,必须大于0,一般都取1;
surface,这个比较重要,是你生成的VirtualDisplay的载体,我的理解是,VirtualDisplay的内容是一帧帧的屏幕截图(所以你看到是有宽高,像素密度等设置),所以MediaProjection获取到的其实是一帧帧的图,然后通过surface(surface你可以理解成是android的一个画布,默认它会以每秒60帧来刷新,这里我们不再展开细说),来顺序播放这些图片,形成视频。
surface我们可以这样获取到:
SurfaceView mSurfaceView = (SurfaceView) findViewById(R.id.surface);
Surface mSurface = mSurfaceView.getHolder().getSurface();
- 1
- 2
- 1
- 2
对应的我们要在XML里面写一个SurfaceView的控件:
<SurfaceView
android:id="@+id/surface"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_centerHorizontal="true"android:layout_alignParentTop="true"/>
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
这样,屏幕所捕获的内容,就显示在这个SurfaceView上面了
Android5.0视频录制--MediaProjection相关推荐
- Android视频录制--MediaProjection
最近在做视频录制的项目,把自己这段时间的研究内容断断续续发布到博客上,今天要讲的是MediaProjection. android在5.0系统之前,是没有开放视频录制的接口的,如果要录制视频,必须要先 ...
- android5.0以上webview无法播放腾讯优酷等网络视频
最近一直在做浏览器项目,遇到某些手机在线无法播放腾讯视频,搞得我很郁闷,网上查了很多资料,大部分都说开了硬件加速就可以了,可是硬件加速早开了,也没用.继续找啊找啊,又看到说是http和https重定向 ...
- Android5.0录屏方案
导语 本文主要是围绕android直播助手的功能做了一些研究,因为之前对Android多媒体相关的内容知之甚少,只有概念,于是查阅了相关资料并做以总结. 由于我对音视频相关知识零基础所以补充了一些相关 ...
- Android视频录制--屏幕录制
上一篇介绍了MediaProjection,这个类可以用来实现安卓屏幕数据的采集,也就是手机一帧帧的截图,并输出成byte流的格式. 有兴趣的同学可以看这篇: Android视频录制--MediaPr ...
- 视频录制,压缩实现源码
实现代码: <!DOCTYPE html> <html><head><meta charset="utf-8"><title& ...
- linux系统 插优盘安装xvidcap,linux下的视频录制软件xvidcap
1.xvidcap简介 在linux如果我们想要进行视频录制,那么xvidcap是一个不错的选择.Xvidcap 是一个可将屏幕上的操作过程录制下来并保存为视频的小工具.对于需要制作产品演示和教学的朋 ...
- android视频录制(调用系统视频录制)
2019独角兽企业重金招聘Python工程师标准>>> 最近客户有一个视频录制的需求,于是,我就整理下可行的方案. 启动系统视频录制的代码: Intent mIntent = new ...
- Android 中使用MediaRecorder进行录像详解(视频录制)
简单的视频录制功能. package com.video; import java.io.IOException; import android.app.Activity; import androi ...
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制(转)
概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...
最新文章
- [SinGuLaRiTy] 贪心题目复习
- php中的var_dump()方法的详细说明
- 2020年度盘点出炉!技术好文一口气读完
- iNeuOS工业互联网操作系统,提升分布式云端控制安全策略和增加实时日志功能...
- Struts2 文件上传
- 《原神》移动端总收入达8.74亿美元
- angular 和 backbone 区别
- 菜鸟学习初级教程-----强烈推荐(看完后成黑客拉)
- 亚马逊 速卖通 Lazada 敦煌网测评自养号技巧知识
- uniapp使用网易易盾
- 中国邮箱品牌使用情况调研——TOM邮箱
- position的8种定位方式
- 【毕业设计】基于SSM实现酒店管理系统(论文+源码+ppt+视频)
- CUDA out of memory(然鹅明明还有空间)
- 偶然发现的一篇文章 激励自己吧。
- SFP DDM接口的测量值计算
- 云栖大会人脸识别闸机【技术亮点篇6】--人脸识别闸机采用活体检测技术
- K-java软件测试指南
- 第一次来!我是白鲸社区,大家多多支持!
- 如何使用Yii2编程:上传文件