Android视频录制--MediaProjection
最近在做视频录制的项目,把自己这段时间的研究内容断断续续发布到博客上,今天要讲的是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相关推荐
- Android视频录制--屏幕录制
上一篇介绍了MediaProjection,这个类可以用来实现安卓屏幕数据的采集,也就是手机一帧帧的截图,并输出成byte流的格式. 有兴趣的同学可以看这篇: Android视频录制--MediaPr ...
- Android视频录制从不入门到入门系列教程(一)————简介
一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...
- 利用FFmpeg玩转Android视频录制与压缩(二)
请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个 ...
- 利用FFmpeg玩转Android视频录制与压缩(三)
请尊重原创,转载请注明出处http://blog.csdn.net/mabeijianxi/article/details/73011313 前言 上一回说到啊,这千秋月没是佳人离别,时逢枯枝落旧城, ...
- Android视频录制并转GIF格式
一.概述 我们在学习Android时候,往往需要查阅很多的资料教程,这时候经常会发现大神写的博客往往都是图文并茂的,充满可能性,效果直观的,所以自己个人记录一些日常工作中遇到的问题以及见解,也希望能够 ...
- 用FFmpeg玩转Android视频录制与压缩
[置顶] 利用FFmpeg玩转Android视频录制与压缩(二) 标签: Android视频采集Android视频编码Android FFmpegAndroid 视频压缩视频编码 2017-06-10 ...
- android视频录制(调用系统视频录制)
2019独角兽企业重金招聘Python工程师标准>>> 最近客户有一个视频录制的需求,于是,我就整理下可行的方案. 启动系统视频录制的代码: Intent mIntent = new ...
- android 视频录制和上传,关于android实时视频录制与上传 .
关于android的实时视频录制现在网上炒的很火,我想把自己学习研究的一个视频录制的demo 的心得与大家分享一下 使用的是MediaRecorder 以及使用SurfaceView进行录制的. 视频 ...
- android 视频录制小例子,android 录制视频实例 VideoRecordDemo
[实例简介] [实例截图] [核心代码] package com.example.videorecorddemo; import java.io.IOException; import java.ut ...
最新文章
- (转)mq经验总结-转
- pytest配置文件pytest.ini
- .Net中的多态知识点
- java 静态类的实现_[Java教程]Javascript 静态类的实现
- 【李宏毅机器学习】Recurrent Neural Network Part1 循环神经网络(p20) 学习笔记
- 如何在DOS下用TCP/IP协议进行登录Windows 2K?
- 【NOI OpenJudge】【1.4】编程基础之逻辑表达式与条件分支
- Activiti CamelTask(骆驼任务)
- wordpress php幻灯片代码,WordPress无需插件实现幻灯片效果
- 试手 破解多开限制
- 安装JDK与配置java环境变量
- 一起自学SLAM算法:写在前面
- python中dic的操作
- 高德地图:点击获取火星坐标(经纬度)
- 丽怡酒店品牌彰显运营实力,领跑中端酒店赛道
- jsp70860基于web的大学教室管理系统
- 蔡盈芳:企业数字档案馆整体架构及其层次模型研究
- 高等数学复习之二重积分
- [转]PMP之挣值管理(PV、EV、AC、SV、CV、SPI、CPI)的记忆方法
- 用计算机怎么计算p级数,2020考研计算机数学49个基础知识点
热门文章
- web pc端 微信授权登陆 实例详解
- JS|JavaScript库
- 传动效率95% 精锐广用APEX行星齿轮减速机ABR系列
- 位深度讲解,opencv8位单通道和32位单通道解析
- 内部排序算法的实现(插入排序、选择排序、交换排序、归并排序、计数排序)
- 已测试Xshell6石皮解版(解压后可直接使用),舒服!!!
- 计算机专业学生宿舍用台式,大学宿舍限电可以用台式机吗 大学宿舍用台式机跳闸怎么办...
- 一个网站要多大服务器,放一个网站要多大云服务器
- android动态壁纸提取,大神已提取出一加8T的动态壁纸:Android 8.0+设备均可使用
- 微服务做成镜像部署到容器