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相关推荐

  1. Android视频录制--MediaProjection

    最近在做视频录制的项目,把自己这段时间的研究内容断断续续发布到博客上,今天要讲的是MediaProjection. android在5.0系统之前,是没有开放视频录制的接口的,如果要录制视频,必须要先 ...

  2. android5.0以上webview无法播放腾讯优酷等网络视频

    最近一直在做浏览器项目,遇到某些手机在线无法播放腾讯视频,搞得我很郁闷,网上查了很多资料,大部分都说开了硬件加速就可以了,可是硬件加速早开了,也没用.继续找啊找啊,又看到说是http和https重定向 ...

  3. Android5.0录屏方案

    导语 本文主要是围绕android直播助手的功能做了一些研究,因为之前对Android多媒体相关的内容知之甚少,只有概念,于是查阅了相关资料并做以总结. 由于我对音视频相关知识零基础所以补充了一些相关 ...

  4. Android视频录制--屏幕录制

    上一篇介绍了MediaProjection,这个类可以用来实现安卓屏幕数据的采集,也就是手机一帧帧的截图,并输出成byte流的格式. 有兴趣的同学可以看这篇: Android视频录制--MediaPr ...

  5. 视频录制,压缩实现源码

    实现代码: <!DOCTYPE html> <html><head><meta charset="utf-8"><title& ...

  6. linux系统 插优盘安装xvidcap,linux下的视频录制软件xvidcap

    1.xvidcap简介 在linux如果我们想要进行视频录制,那么xvidcap是一个不错的选择.Xvidcap 是一个可将屏幕上的操作过程录制下来并保存为视频的小工具.对于需要制作产品演示和教学的朋 ...

  7. android视频录制(调用系统视频录制)

    2019独角兽企业重金招聘Python工程师标准>>> 最近客户有一个视频录制的需求,于是,我就整理下可行的方案. 启动系统视频录制的代码: Intent mIntent = new ...

  8. Android 中使用MediaRecorder进行录像详解(视频录制)

    简单的视频录制功能. package com.video; import java.io.IOException; import android.app.Activity; import androi ...

  9. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制(转)

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

最新文章

  1. [SinGuLaRiTy] 贪心题目复习
  2. php中的var_dump()方法的详细说明
  3. 2020年度盘点出炉!技术好文一口气读完
  4. iNeuOS工业互联网操作系统,提升分布式云端控制安全策略和增加实时日志功能...
  5. Struts2 文件上传
  6. 《原神》移动端总收入达8.74亿美元
  7. angular 和 backbone 区别
  8. 菜鸟学习初级教程-----强烈推荐(看完后成黑客拉)
  9. 亚马逊 速卖通 Lazada 敦煌网测评自养号技巧知识
  10. uniapp使用网易易盾
  11. 中国邮箱品牌使用情况调研——TOM邮箱
  12. position的8种定位方式
  13. 【毕业设计】基于SSM实现酒店管理系统(论文+源码+ppt+视频)
  14. CUDA out of memory(然鹅明明还有空间)
  15. 偶然发现的一篇文章 激励自己吧。
  16. SFP DDM接口的测量值计算
  17. 云栖大会人脸识别闸机【技术亮点篇6】--人脸识别闸机采用活体检测技术
  18. K-java软件测试指南
  19. 第一次来!我是白鲸社区,大家多多支持!
  20. 如何使用Yii2编程:上传文件

热门文章

  1. ac1900 linksys 恢复_Linksys WRT1900AC V2路由器拆解赏析
  2. 曾GMV过亿的淘宝品牌FFAN(泛泛)宣布店铺歇业
  3. 电机参数识别-仿真模型建立
  4. 运动控制第三篇之直流电机参数辨识
  5. 过滤蓝光可以改善睡眠品质?荷兰研究特殊防蓝光眼镜
  6. 老板想要的简单方案 vs. 程序员理解的需求 |漫画
  7. java坦克大战最终代码
  8. 工作中遇到的小问题以及解决办法(mongodb方面)
  9. vba编程控制excel输入不同的密码显示不同的sheet
  10. C# 检验身份证号并提取生日和性别