Android 屏幕录制
自己实现了Android的屏幕录制App。
用了MediaProjection类来作为源,MediaRecoder来捕捉,编码转换为本地视频。
效果图:





主要是这段代码开始录像:
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);//开始录像
录像结束后在回调函数中处理:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode != REQUEST_CODE) {
Log.e(TAG, "Unknown request code: " + requestCode);
return;
}
if (resultCode != RESULT_OK) {
Toast.makeText(this,
"Screen Cast Permission Denied", Toast.LENGTH_SHORT).show();
mToggleButton.setChecked(false);
return;
}
//应用最小化 后台运行
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
mMediaProjectionCallback = new MediaProjectionCallback();//回调类
mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
mMediaProjection.registerCallback(mMediaProjectionCallback, null);//注册回调类
mVirtualDisplay = createVirtualDisplay();
mMediaRecorder.start();
}
回调处理的事情其实就是将录像的类全都关闭释放:
private class MediaProjectionCallback extends MediaProjection.Callback {
@Override
public void onStop() {
if (mToggleButton.isChecked()) {
mToggleButton.setChecked(false);
mMediaRecorder.stop();
mMediaRecorder.reset();
Log.v(TAG, "Recording Stopped");
}
mMediaProjection = null;
stopScreenSharing();
}
}
createVirtualDisplay()是我们自己定义的
/*
参数说明:
* 第一个参数:虚拟画面名称
* 第二个参数:虚拟画面的宽度
* 第三个参数:虚拟画面的高度
* 第四个参数:虚拟画面的标志
* 第五个参数:虚拟画面输出的Surface
* 第六个参数:虚拟画面回调接口
其中最重要的就是第五个参数,录制画面输出的地方,他这里介绍的是一个Surface类型,那么我们如果想操作录制之后的视频数据,就需要创建一个Surface类型即可。
1、如果想截屏,那么可以使用ImageReader类的getSurface方法获取
2、如果想录制视频进行编码,可以使用MediaRecorder类的getSurface方法获取
*/
private VirtualDisplay createVirtualDisplay() {
return mMediaProjection.createVirtualDisplay("MainActivity",
DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
/*surface是mediaRecorder的,以mediaprojection为源输出到surface,捕获*/
mMediaRecorder.getSurface(), null /*Callbacks*/, null
/*Handler*/);
}
弄完之后我们跳到另一个Activity,显示录制完的视频的缩略图,并添加分享播放和重新录制功能。
显示视频缩略图:
public Bitmap getVideoThumbnail(String filePath) {
Bitmap bitmap = null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(filePath);
bitmap = retriever.getFrameAtTime();
}
catch(IllegalArgumentException e) {
e.printStackTrace();
}
catch (RuntimeException e) {
e.printStackTrace();
}
finally {
try {
retriever.release();
}
catch (RuntimeException e) {
e.printStackTrace();
}
}
return bitmap;
}
播放:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);//主要是这里指定了ACTION File vedioFile = new File(Environment
.getExternalStoragePublicDirectory(Environment
.DIRECTORY_DOWNLOADS), "/video.mp4");
Uri uri = Uri.parse(vedioFile.getAbsolutePath());
intent.setDataAndType(uri,"video/*");
startActivity(intent);
分享:
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND); shareIntent.setType("audio/*"); File vedioFile = new File(Environment
.getExternalStoragePublicDirectory(Environment
.DIRECTORY_DOWNLOADS), "/video.mp4"); shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(vedioFile)); //设置分享列表的标题,并且每次都显示分享列表
startActivity(Intent.createChooser(shareIntent, "分享到"));
Android 屏幕录制的更多相关文章
- Android屏幕录制
自己实现了Android的屏幕录制App. 用了MediaProjection类来作为源,MediaRecoder来捕捉,编码转换为本地视频. 效果图: 主要是这段代码开始录像: startActiv ...
- 百万级日活 App 的屏幕录制功能是如何实现的
Android 从 4.0 开始就提供了手机录屏方法,但是需要 root 权限,比较麻烦不容易实现.但是从 5.0 开始,系统提供给了 App 录制屏幕的一系列方法,不需要 root 权限,只需要用户 ...
- 【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧
因为写博客总是需要录制 Android 软件的演示效果, 研究了将近一小时找到了合适的工具; 录制流程 : -- 1. 录制 Android 手机屏幕内容 : 使用 拍大师 软件录制 Android ...
- 【Android Studio安装部署系列】二十六、Android studio录制屏幕并生成gif文件
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio自带录制屏幕功能,那么就可以很方便地将手机上的屏幕操作录制成视频.然后借助一些软件或者网站转换成gif文 ...
- 屏幕录制:SCR Screen Recorder Pro v0.14.3汉化破解版
应用概览 <ignore_js_op> 软件名称:屏幕录制:SCR Screen Recorder Pro 软件版本:v0.14.3汉化破解版软件语言:中文软件大小:3.5M软件包名:co ...
- 利用FFmpeg玩转Android视频录制与压缩(二)<转>
转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女 ...
- anyRTC iOS端屏幕录制开发指南
一. 概述 实现直播过程中共享屏幕分为两个步骤:屏幕数据采集和流媒体数据推送.前对于 iOS 来说,屏幕采集需要系统的权限,受制于iOS系统的限制,第三方 app 并没有直接录制屏幕的权限,必须通过系 ...
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
的最佳方案 标签: Android屏幕旋转AsyncTaskProgressDialog 2014-07-19 09:25 39227人阅读 评论(46) 收藏 举报 分类: [android 进阶之 ...
- ffmpeg 屏幕录制 so easy....
linux Linux下使用FFmpeg进行屏幕录制相对比较方便,可以使用x11grab,使用如下的命令: ffmpeg -f x11grab -s 1600x900 -r 50 -vcodec li ...
随机推荐
- 搭建git服务器(临时服务器,命令行形式,针对2到5人左右,轻量)
服务端配置 ############################################################################################## ...
- 洛谷P2800 又上锁妖塔
放题解 题目传送门 放代码
- HTML 培训教程
HTML培训教程 1. HTML概述 1.1. 什么是 HTML 文件? n ...
- PHP 位运算符
位运算符 位运算符是指对二进制位从低位到高位对齐后进行运算. 符号 作用 举例 个人理解 & 按位与 $m & $n 全1为1,否则为0 | 按位或 $m | $n 全0为0,有1为1 ...
- UESTC - 618
#include<bits/stdc++.h> using namespace std; const int maxn = 1e6+11; const int N = 1e6; typed ...
- 马的移动(BFS) 详细注释 一个具有情怀的题目
题目描述 小明很喜欢下国际象棋,一天,他拿着国际象棋中的"马"时突然想到一个问题: 给定两个棋盘上的方格a和b,马从a跳到b最少需要多少步? 现请你编程解决这个问题. 提示:国际象 ...
- centos7.1部署java环境服务器
1.检查操作系统自带java是jdk还是jre(否有javac,本例中没有javac) [root@bogon ~]# ls -l /usr/lib/jvm/总用量 0drwxr-xr-x. 3 ro ...
- Windows 7安装PlayReady出现“任务被禁用”错误信息
问题描述: Windows 7的Windows media center中安装PlayReady时出现:错误信息:任务被禁用.(异常来自 HRESULT:0x80041326) 解决办法: 先请确认是 ...
- PHP unlink删除本地中文名称的文件
由于编码不一样,用unlink()方法删除本地中文名称的材料之前,必须先转码,才能删除成功. 核心代码如下: //删除本地的议题材料(本地上传的材料) if($local_ma ...
- console命令详解:(转载学习)
Console命令详解,让调试js代码变得更简单 Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上手.我曾经翻译过一篇<Firebug入门指南>,介绍了一些 ...