最近在做视频录制的项目,把自己这段时间的研究内容断断续续发布到博客上,今天要讲的是MediaProjection。

android在5.0系统之前,是没有开放视频录制的接口的,如果要录制视频,必须要先root,这部分我会在随后的博客中细讲。
在5.0,Google终于开放了视频录制的接口(其实严格来说,是屏幕采集的接口),也就是MediaProjection和MediaProjectionManager。

首先来说MediaProjectionManager,它是一个系统级的服务,类似WindowManager,AlarmManager等,你可以通过getSystemService方法来获取它的实例:

MediaProjectionManager mMediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);

获取到实例后,录像的过程如下(有点像拍照的流程):
首先:

Intent captureIntent = mMediaProjectionManager.createScreenCaptureIntent();
startActivityForResult(captureIntent, REQUEST_CODE);

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;}

看着很眼熟是吧,拍照的是这样:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 调用系统自带照相机
startActivityForResult(intent, REQUEST_CODE_LAUNCHCAMERA);

所以这里是创建了一个隐式的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();}

我们通过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*/);}

可以看到,我们调用了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();

对应的我们要在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"/>

这样,屏幕所捕获的内容,就显示在这个SurfaceView上面了

文章涉及到的代码,请到我的资源里下载:
MediaProjectionDemo

Android视频录制--MediaProjection相关推荐

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

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

  2. Android视频录制从不入门到入门系列教程(一)————简介

    一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...

  3. 利用FFmpeg玩转Android视频录制与压缩(二)

    请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个 ...

  4. 利用FFmpeg玩转Android视频录制与压缩(三)

    请尊重原创,转载请注明出处http://blog.csdn.net/mabeijianxi/article/details/73011313 前言 上一回说到啊,这千秋月没是佳人离别,时逢枯枝落旧城, ...

  5. Android视频录制并转GIF格式

    一.概述 我们在学习Android时候,往往需要查阅很多的资料教程,这时候经常会发现大神写的博客往往都是图文并茂的,充满可能性,效果直观的,所以自己个人记录一些日常工作中遇到的问题以及见解,也希望能够 ...

  6. 用FFmpeg玩转Android视频录制与压缩

    [置顶] 利用FFmpeg玩转Android视频录制与压缩(二) 标签: Android视频采集Android视频编码Android FFmpegAndroid 视频压缩视频编码 2017-06-10 ...

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

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

  8. android 视频录制和上传,关于android实时视频录制与上传 .

    关于android的实时视频录制现在网上炒的很火,我想把自己学习研究的一个视频录制的demo 的心得与大家分享一下 使用的是MediaRecorder 以及使用SurfaceView进行录制的. 视频 ...

  9. android 视频录制小例子,android 录制视频实例 VideoRecordDemo

    [实例简介] [实例截图] [核心代码] package com.example.videorecorddemo; import java.io.IOException; import java.ut ...

最新文章

  1. (转)mq经验总结-转
  2. pytest配置文件pytest.ini
  3. .Net中的多态知识点
  4. java 静态类的实现_[Java教程]Javascript 静态类的实现
  5. 【李宏毅机器学习】Recurrent Neural Network Part1 循环神经网络(p20) 学习笔记
  6. 如何在DOS下用TCP/IP协议进行登录Windows 2K?
  7. 【NOI OpenJudge】【1.4】编程基础之逻辑表达式与条件分支
  8. Activiti CamelTask(骆驼任务)
  9. wordpress php幻灯片代码,WordPress无需插件实现幻灯片效果
  10. 试手 破解多开限制
  11. 安装JDK与配置java环境变量
  12. 一起自学SLAM算法:写在前面
  13. python中dic的操作
  14. 高德地图:点击获取火星坐标(经纬度)
  15. 丽怡酒店品牌彰显运营实力,领跑中端酒店赛道
  16. jsp70860基于web的大学教室管理系统
  17. 蔡盈芳:企业数字档案馆整体架构及其层次模型研究
  18. 高等数学复习之二重积分
  19. [转]PMP之挣值管理(PV、EV、AC、SV、CV、SPI、CPI)的记忆方法
  20. 用计算机怎么计算p级数,2020考研计算机数学49个基础知识点

热门文章

  1. web pc端 微信授权登陆 实例详解
  2. JS|JavaScript库
  3. 传动效率95% 精锐广用APEX行星齿轮减速机ABR系列
  4. 位深度讲解,opencv8位单通道和32位单通道解析
  5. 内部排序算法的实现(插入排序、选择排序、交换排序、归并排序、计数排序)
  6. 已测试Xshell6石皮解版(解压后可直接使用),舒服!!!
  7. 计算机专业学生宿舍用台式,大学宿舍限电可以用台式机吗 大学宿舍用台式机跳闸怎么办...
  8. 一个网站要多大服务器,放一个网站要多大云服务器
  9. android动态壁纸提取,大神已提取出一加8T的动态壁纸:Android 8.0+设备均可使用
  10. 微服务做成镜像部署到容器