http://blog.csdn.net/wds1181977/article/details/52174840

MediaProjection介绍

MediaProjection可以用来捕捉屏幕,具体来说可以截取当前屏幕和录制屏幕视频。MediaProjection由MediaProjectionManager来管理和获取。

使用步骤

首先获取MediaProjectionManager,和其他的Manager一样通过 Context.getSystemService() 传入参数MEDIA_PROJECTION_SERVICE获得实例。

接着调用MediaProjectionManager.createScreenCaptureIntent()弹出dialog询问用户是否授权应用捕捉屏幕,同时覆写onActivityResult()获取授权结果。

如果授权成功,通过MediaProjectionManager.getMediaProjection(int resultCode, Intent resultData)获取MediaProjection实例,通过MediaProjection.createVirtualDisplay(String name, int width, int height, int dpi, int flags, Surface surface, VirtualDisplay.Callback callback, Handler handler)创建VirtualDisplay实例。实际上在上述方法中传入的surface参数,是真正用来截屏或者录屏的。

截屏

截屏这里用到ImageReader类,这个类的getSurface()方法获取到surface直接传入MediaProjection.createVirtualDisplay()方法中,此时就可以执行截取。通过ImageReader.acquireLatestImage()方法即可获取当前屏幕的Image,经过简单处理之后即可保存为Bitmap。

           private void startCapture() {mImageName = System.currentTimeMillis() + ".png";Log.e(TAG, "image name is : " + mImageName);Image image = mImageReader.acquireLatestImage();int width = image.getWidth();int height = image.getHeight();final Image.Plane[] planes = image.getPlanes();final ByteBuffer buffer = planes[0].getBuffer();int pixelStride = planes[0].getPixelStride();int rowStride = planes[0].getRowStride();int rowPadding = rowStride - pixelStride * width;Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);bitmap.copyPixelsFromBuffer(buffer);bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);image.close();if (bitmap != null) {Log.e(TAG, "bitmap  create success ");try {File fileFolder = new File(mImagePath);if (!fileFolder.exists())fileFolder.mkdirs();File file = new File(mImagePath, mImageName);if (!file.exists()) {Log.e(TAG, "file create success ");file.createNewFile();}FileOutputStream out = new FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);out.flush();out.close();Log.e(TAG, "file save success ");Toast.makeText(this.getApplicationContext(), "截图成功", Toast.LENGTH_SHORT).show();} catch (IOException e) {Log.e(TAG, e.toString());e.printStackTrace();}}}

录屏

录屏需要用到上篇博文中的MediaCadec,这个类将原始的屏幕数据编码,在通过MediaMuxer分装为mp4格式保存。MediaCodec.createInputSurface()获取一个surface对象讲起传入MediaProjection.createVirtualDisplay()即可获取屏幕原始多媒体数据,之后读取MediaCodec编码输出数据经过MediaMuxer封装处理为mp4即可播放,实现录屏。

       private void recordVirtualDisplay() {//循环多去编解码器输出数据经过处理保存为mp4while (!mIsQuit.get()) {int index = mMediaCodec.dequeueOutputBuffer(mBufferInfo, 10000);Log.i(TAG, "dequeue output buffer index=" + index);if (index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {//后续输出格式变化resetOutputFormat();} else if (index == MediaCodec.INFO_TRY_AGAIN_LATER) {//请求超时Log.d(TAG, "retrieving buffers time out!");try {// wait 10msThread.sleep(10);} catch (InterruptedException e) {}} else if (index >= 0) {//有效输出if (!mMuxerStarted) {throw new IllegalStateException("MediaMuxer dose not call addTrack(format) ");}encodeToVideoTrack(index);mMediaCodec.releaseOutputBuffer(index, false);}}}private void encodeToVideoTrack(int index) {//输出数据为mp4文件ByteBuffer encodedData = mMediaCodec.getOutputBuffer(index);if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {//是特定格式信息等配置数据,不是媒体数据// The codec config data was pulled out and fed to the muxer when we got// the INFO_OUTPUT_FORMAT_CHANGED status.// Ignore it.Log.d(TAG, "ignoring BUFFER_FLAG_CODEC_CONFIG");mBufferInfo.size = 0;}if (mBufferInfo.size == 0) {Log.d(TAG, "info.size == 0, drop it.");encodedData = null;} else {Log.d(TAG, "got buffer, info: size=" + mBufferInfo.size+ ", presentationTimeUs=" + mBufferInfo.presentationTimeUs+ ", offset=" + mBufferInfo.offset);}if (encodedData != null) {//存在编码数据encodedData.position(mBufferInfo.offset);encodedData.limit(mBufferInfo.offset + mBufferInfo.size);mMuxer.writeSampleData(mVideoTrackIndex, encodedData, mBufferInfo);//写入Log.i(TAG, "sent " + mBufferInfo.size + " bytes to muxer...");}}private void resetOutputFormat() {// should happen before receiving buffers, and should only happen onceif (mMuxerStarted) {throw new IllegalStateException("output format already changed!");}MediaFormat newFormat = mMediaCodec.getOutputFormat();Log.i(TAG, "output format changed.\n new format: " + newFormat.toString());mVideoTrackIndex = mMuxer.addTrack(newFormat);mMuxer.start();mMuxerStarted = true;Log.i(TAG, "started media muxer, videoIndex=" + mVideoTrackIndex);}

附录参考

官方文档

Android视频录制

Android 5.0截屏

Android录屏代码 
本文Demo

Android5.0免Root截屏,录屏相关推荐

  1. 截屏录屏和屏幕颜色抓取

    分享截屏录屏和屏幕颜色抓取两个工具 这两个工具都是我常用的,觉得还不错 下面分享链接以及使用方法 截屏录屏取色工具链接: https://pan.baidu.com/s/1GA75-5oX4yuujU ...

  2. 咔咔截屏录屏大师如何录制手机视频

    首先确保你的 Android 已经 ROOT ,那么接下来 小米手机需要开发版,并且需要在"授权管理"中开启"咔咔截屏录屏大师"的 ROOT 权限 具体操作:小 ...

  3. webrtc性能优化:MacOS下的快速截屏录屏方式

    截屏和录屏现在已经变成了各个系统中最最基础的功能了,特别是直播的兴起和疫情促进的会议系统,诸如远程办公,都会使用到系统录屏的功能,录屏的快慢又决定了我们直播和会议的流畅程度. 最近各个大厂商也推出了很 ...

  4. android 禁止截屏录屏功能,android 应用禁止截屏录屏

    更新记录 1.0.0(2021-02-01) Android 应用禁止截屏录屏 平台兼容性 Android iOS 适用版本区间:4.4 - 11.0 × 原生插件通用使用流程: 购买插件,选择该插件 ...

  5. 多种方式实现web端截屏录屏

    本文通过使用webrtc.dom监听.使用插件三种方式实现截屏,使用webrtc.dom监听来实现录屏 使用webrtc实现截屏录屏 ①实现录屏 // 音频或视频流 let mediaStreamTr ...

  6. 超便携式截屏录屏软件FastStone Capture

    超便携式截屏录屏软件FastStone Capture 转载于:https://www.cnblogs.com/Renyi-Fan/p/8628196.html

  7. iphone屏幕镜像如何全屏_苹果系统截屏录屏+标记剪辑功能详解( iPhone/iPad/Mac)

    苹果系统中的截屏和录屏.标记和剪辑功能一如它的其他产品设计,做得非常细致.在我们日常的工作中,不免会遇到这些功能,今天小编就给大家详细讲解下苹果系统截屏录屏.标记剪辑功能,希望对大家有所帮助! 001 ...

  8. 截屏录屏软件分享 FSCapture、Snipaste【目前见过的最好用的录屏软件】

    目录 截屏录屏软件--FSCapture 截屏软件--Snipaste-2.4-Beta-x64.zip 截屏录屏软件--FSCapture 使用教程(17:09):https://www.bilib ...

  9. 苹果xr截屏怎么截_苹果系统截屏录屏+标记剪辑功能详解( iPhone/iPad/Mac)

    苹果系统中的截屏和录屏.标记和剪辑功能一如它的其他产品设计,做得非常细致.在我们日常的工作中,不免会遇到这些功能,今天小编就给大家详细讲解下苹果系统截屏录屏.标记剪辑功能,希望对大家有所帮助! 001 ...

  10. DXGI快速截屏录屏技术

    DXGI快速截屏录屏技术 概述   很多地方都需要用到截屏/录屏技术,比如桌面直播,桌面录制等等.在微软Windows平台,有很多截屏的接口,不过大多数性能并不理想,Windows8以后微软引入了一套 ...

最新文章

  1. Splay ---- 2018牛客多校第三场 区间翻转搞区间位移 或者 rope可持久化块状链表
  2. 谷歌浏览器扩展程序XDM_请立即更新您的谷歌Chrome浏览器 获取重要的安全补丁程序...
  3. 【温故知新】CSS学习笔记(盒子水平居中方法)
  4. Linux进程管理(第二版) --进程管理命令
  5. c语言判断这天是星期几,【求指导!!】输入年,月,日,然后判断这天是星期几!!!!!...
  6. java中4种修饰符访问权限的区别
  7. python网络开发框架_宿迁python网站开发框架收费
  8. thinkphp5.0 session驱动方式问题汇总
  9. 使用SAP HANA ODBC驱动程序进行连接
  10. 【SQL学习】select语句使用实例
  11. 计算机用户名,账户名更改
  12. Python3,区区几行代码,turtle替我实现了我多年的绘画梦。
  13. 对序列化器、“对象”的理解
  14. E10下64位浏览器与32位浏览器切换教程
  15. python情人节之玫瑰花与表白方式,用python画一朵玫瑰花,拿去表白趴
  16. go swag常用注释
  17. K-means原理、优化及应用
  18. 硬件描述语言要用计算机吗,非过程计算机硬件描述语言
  19. 论文阅读笔记:Self-Attention with Relative Position Representations
  20. matlab仿真迈克尔逊干涉仪工作 单频非定域等倾干涉

热门文章

  1. Atitit.pagging  翻页功能解决方案专题 与 目录大纲 v3 r44.docx
  2. Atitit cms
  3. atitit.web原理 理论attilax总结
  4. atitit.提升开发效率---MDA 软件开发方式的革命(4)----编辑表单建模
  5. 《程序员》: Andrew Ng谈Deep Learning
  6. 《Serverless 架构》序言
  7. SSD硬盘的几个常见概念SATA、PCIE、M.2、AHCI、NVME总结
  8. 数据湖生态联盟正式成立
  9. 【优化算法】孪生支持向量机(TWSVM)【含Matlab源码 1257期】
  10. 【语音去噪】基于matlab改进谱减法语音去噪【含Matlab源码 569期】