手机游戏直播中的ios 录屏功能实现怎么实现

Android中直播视频技术探究之---桌面屏幕视频数据源采集功能分析
之前介绍了直播视频中一种视频源数据采集:摄像头Camera视频数据采集分析中介绍了利用Camera的回调机制,获取摄像头的每一帧数据,然后进行二次处理进行推流。现在我们在介绍另外一种视频源类型,屏幕桌面视频数据源,这个就是录屏功能,这个在Android中的利用场景现阶段也是很多的,比如像斗鱼这些直播app,在录制游戏的时候用的还是比较多的,因为现在的移动游戏也那么火,游戏视频直播也是一个很不错的产业!
二、技术方案
下面先来分析一下Android中录制屏幕采用的方案有哪些?现阶段Android中录制屏幕的话大致就两种方案:
1、Android5.0以下,获取root权限使用adb shell screenrecord命令功能进行录制
2、Android5.0以上,使用Api功能:MediaProjection和VirtualDisplay
这两种方式其实在底层的实现机制是一样的,因为在5.0之前,Google可能介于录制屏幕功能具有一定的危险性,所以就没有开放此功能,但是不知为何5.0开放了,当然开放了就立马产生了一个,这个下一篇文章中介绍。从安全角度考虑,在屏幕截屏和录制功能不应该暴露出来,因为这个功能太危险了,之前有报道某某APP利用这个功能,在后台录制屏幕,然后传递到服务端,那么当一个用户在输入账号信息的时候,全部被录制了,那么就存在非常大的风险。
三、使用命令功能录制视频
下面先来介绍一下Android5.0一下录制屏幕功能
Android中在截屏时可以使用adb shell screencap命令,录制视频时可以使用adb shell screenrecord,先来看看这个命令的用法:
(1)、基本使用
录制默认分辨率,默认4Mbps,默认180s的视频,保存到sdcard上名为FILENAME.mp4
$adb shell screenrecord /sdcard/FILENAME.mp4
(2)、指定分辨率(参数:--size)
//分辨率为112x112,建议不要指定分辨率,使用默认分辨率效果最佳
$adb shell screenrecord --size 112x112 /sdcard/FILENAME.mp4
注意:分辨率不是完全可以随意定制的,比如在我手机上录制100x100的会提示错误:
$adb shell screenrecord --size 100x100 /sdcard/FILENAME.mp4
(3)、指定比特率(参数:--bit-rate)
设置比特率为8Mbps,比特率越大,文件越大,画面越清晰
$adb shell screenrecord --bit-rate 8000000 /sdcard/FILENAME.mp4
(4)、旋转(参数:--rotate)
$adb shell screenrecord --rotate /sdcard/FILENAME.mp4
注意:不支持声音,如有需要,另外独立录制。此命令需要root权限才可以使用,这个也是已非常大的局限性!
下面来看一下案例:
使用adb shell screenrecord /sdcard/capture.mp4 命令录制视频存到SD卡中,然后在使用adb pull导出到本地即可
看看效果:
功能我们可以看到了,可以发现其实这个功能测试用的比较多,他们在测试的时候,有时候复杂的测试场景难以重现,就可以使用录制屏幕功能,来跟踪问题。
那么现在如果一个应用获取到了root功能,就开始偷偷的在后台录制视频,然后把录制之后的视频文件发到服务端,然后进行分析,那么是非常危险的。
虽然这个功能可以了,但是我们发现,在直播的时候,如何进行数据流采取然后推流到服务端呢?因为在视频采集推流的时候,都是获取视频流数据,在底层使用rtmp进行数据打包发送服务端,那么这里有人会想,能不能一边录制视频到本地文件,然后一边在去读取这个文件流字节,进行推流?其实这种想法是好的,但是没有那么做的,因为这效率问题,其次是文件读写不同步问题,这里有一个思路就是,看看adb screenrecord命令的了,因为他最终是采样数据写到本地文件的,那么在这个之前我们可以进行获取视频流即可,但是这个不是本文的重点,因为这个要是介绍的话,那就太多了,而且随着Android系统提升,未来用的多的是Android系统更高版本,所以这里要注重介绍的是5.0加的MediaProjection类来进行屏幕录制。
四、使用开放Api进行录制视频
Android5.0中添加了一套Api来进行屏幕录制功能,就是MediaProjection+VirtualDiaplay,用法也是非常简单的,在使用之前需要申请一下权限,然后获取权限之后,就开始使用即可!
第一、使用流程介绍
下面来看看使用流程:
1》使用getSystemService(Context.MEDIA_PROJECTION_SERVICE)方法获取MediaProjectionManager对象
2》开启授权Intent:startActivityForResult(mProjectionManager.createScreenCaptureIntent(),PERMISSION_CODE);
3》授权之后在onActivityResult方法中进行处理:
这里看到了,利用返回的resultCode和data数据,得到MediaProjection对象,在注册一个回调接口,这个接口就是监听录制的状态信息,最后在创建一个VirtualDisplay
4》创建VirtualDisplay虚拟画面
参数说明:
* 第一个参数:虚拟画面名称
* 第二个参数:虚拟画面的宽度
* 第三个参数:虚拟画面的高度
* 第四个参数:虚拟画面的标志
* 第五个参数:虚拟画面输出的Surface
* 第六个参数:虚拟画面回调接口
其中最重要的就是第五个参数,录制画面输出的地方,他这里介绍的是一个Surface类型,那么我们如果想介绍录制之后的视频数据,就需要创建一个Surface类型即可。在这里有三个方式创建Surface类型:
1》如果想截屏,那么可以使用ImageReader类的getSurface方法获取
2》如果想录制视频进行编码,可以使用MediaRecorder类的getSurface方法获取
3》最后如果想录制视频进行编码,并且获取视频流的话,使用MediaCodec的createInputSurface方法获取
这里我们先介绍前面两个功能,后续的那个功能再详细介绍!
第二、截图功能介绍
先来看看截图功能,其实在Android中截图大体上就三种方式:
第一种使用adb shell screencap命令,但是需要root权限
第二种使用getWindow().getDecorView()获取当前Activity页面的View数据,然后进行保存Bitmap,但是这种方式有限制,一个是他只能截取当前应用的图,而且截取的图片不包括状态栏。
第三种使用MediaProjection和ImageReader来进行截图
下面就来详细介绍如何使用MediaProjection来进行截图
先声明一个ImageReader类,参数比较简单,不过要注意的是这里的尺寸高宽要和下面创建VirtualDisplay一直:
然后把ImageReader的getSurface设置成画面的输出即可。接下来就开始截图:
从ImageReader中获取Image对象,然后得到图片字节数据,生成一个Bitmap即可。
下面来看看效果:
这里把状态栏也成功截取了!到这里就实现了MediaProjection的第一个功能实现屏幕截图功能。
第三、屏幕录制功能介绍
这里先使用MediaRecorder类进行数据的编码工作,而我们真正要进行推流的话需要使用MediaCodec,因为我们需要获取到编码之后的视频流数据,而MediaRecorder是做不到这点的,但是本文只是先介绍录制功能,下一篇文章在详细介绍MediaCodec类功能!
使用MediaRecorder类很简单,以及后面介绍MediaCodec都一样,首先是初始化设置编码器的参数信息,而这些参数信息就那些:
视频尺寸高宽、视频帧率,视频采样率(码率),视频编码格式等
但是MediaRecorder还需要一些其他设置,比如设置视频来源,这里一般就两个来源,一个是摄像头Camera,一个是Surface类型,还有就是视频的输出格式,以及视频的输出文件路径等,当然MediaRecorder还支持音频录制,参数设置和视频差不多:
这里有一些默认格式参数选择:
视频编码格式:default,H263,H264,MPEG_4_SP
获得视频资源:default,CAMERA
音频编码格式:default,AAC,AMR_NB,AMR_WB
获得音频资源:defalut,camcorder,mic,voice_call,voice_communication,voice_downlink,voice_recognition, voice_uplink
输出方式:amr_nb,amr_wb,default,mpeg_4,raw_amr,three_gpp
初始化完了MediaRecorder之后,需要在调用prepare方法做准备,不然后续再调用getSurface会报错的:
在调用这个方法的时候总是遇到这种错误,大致原因就是这个方法必须在prepare方法和stop方法中间调用,或者是视频源必须是Surface类型的。下面再来看看创建VirtualDisplay类:
调用getSurface方法获取到VirtualDisplay的输出画面。然后就需要调用开始编码方法start即可。
下面来看一下效果:
首先先需要系统进行授权,点击立即开始,就开始录制编码了,这里把编码之后的文件保存到sd中,我们在使用adb pull命令导出来,效果这里就不演示了,和上面的adb shell screenrecord命令产生的效果一样!
五、技术概要
1、介绍adb shell screenrecord命令录制视频,但是有局限性就是需要root权限
2、介绍了MediaProjection+ImageReader类进行截图功能
3、介绍了MediaProjection+MediaRecorder类进行视频录制功能
六、遗留问题
采用MediaProjection和MediaRecorder录制视频,或者是命令录制都是保存到本地文件了,但是在真正推流的过程中需要获取到视频流数据,所以这种方式不适合后续的推流工作,下一篇文章就要介绍如何MediaCodec进行视频编码,这个编码类是可以获取到编码之后的视频流数据的。
Android中在5.0之后放出了录制屏幕功能的api,但是其安全性还是值得考虑的,后续一篇文章就详细介绍一个关于MediaProjection的漏洞,导致用户的屏幕操作信息可能被泄露,而这些信息被泄露那么就代表这用户的账号信息存在很大的风险,但是既然有着api了,那么今年又是直播年,在录制游戏这个产业中,这个功能也是无可厚非的重要!用 Android 手机「录屏 + 直播」?很完美很实用的
在以前,我们用的手机的性能不是很多。录屏一般只是用来办公,或者极少部分玩家用于游戏视频的保存「Android 4.0 以下的手机边录屏边玩游戏那叫一个酸爽」,录屏分辨率和码率连差强人意都说不上。
而近几年智能手机的快速发展,手游的迅速普及,越来越多的手机游戏用户也开始从分享图片文字转变为分享自己各种「超神时刻」的精彩小视频,又或者使用自己的手机直播 XX 荣耀,阴 X 师,球球大 XX 等手游,靠着这些游戏成为知名大主播的人也不在少数。
为了解决内录录屏和直播的问题,今天我就给大家推荐两款好用的支持内录的录屏 App 和一个直播 App。
Android 7.0 以下录屏:SCR Screen Recorder Pro
SCR Screen Recorder Pro 可以说是 Android 7.0 之前唯一支持内录的录屏应用了。
视频设置上,除了常用的分辨率和帧率调节,它还支持码率「决定同样分辨率下的画面丰富程度,越大越好」,方向和影片速度调节。为了提高录屏性能,它还支持自定义编码器(H264 和 MPEG-4),自定义通过 CPU,GPU 还是软件特有的 GPU+ 来处理屏幕图像。至于显示前置摄像头画面和触摸操作等功能大家都有,就不详细说了。咱们直接上干货!
SCR Screen Recorder Pro 支持内置音源 + 麦克风同时作为音频来源,最高支持内录 48kHz 的立体声并且支持麦克风增益,给你最好的音质。「理所当然的,内录功能需要 root,没有 root 的同学可以散了」,最难得的是,它在录制内置音源和麦克风的同时你自己也能听到正在录制的声音,看完下面的 App 推荐你就知道为什么说它非常难得了。
虽然 SCR Screen Recorder Pro 支持内录让它鹤立鸡群,但是同时也树大招风。传说它的做法遭到了 Google 的封杀,从 Google Play 上永久下架,到底因为什么原因我们无从得知,不过从 1.0.5 版本添加了 Android 6.0 支持之后,官方就停止了对它的支持,在 Android 7.0+ 的设备上打开 SCR Screen Recorder Pro 会显示「该软件不支持您的系统版本」。
对于用着 Android 6.0 以下系统的同学来讲,SCR Screen Recorder Pro 绝对是一个完美的录屏解决方案。
PS:SCR Screen Recorder Pro 在网上有很多被加料的所谓修改 / 破解版,想要下载的同学可以从 它的官网 上的 slow mirror 下载原版。
Android 7.0 以上录屏:屏幕录像+
SCR Screen Recorder Pro 被封杀了,内录录屏的需求依然在。既然不能上 Google Play 那就干脆不上了。这不酷安的开发者 Tornaco 就给我们带来了 Android 7.0 以上可用的开源内录录屏 App —— 屏幕录像+。
屏幕录像+ 是它的普通录屏 App 兄弟「屏幕录像」的高级版,作为录屏 App 常见的设置它一个不落。除此之外通过 root、Xposed(即将支持)、Magisk(需要在酷安评论区自行下载) 三种模式安装一个音频框架,安装完毕之后即可在录屏时将系统的媒体通道转移到录制通道上实现内录。也是因为这个原理,某些机型可能在录屏的时候听不到声音「实际已经录下来了」。
屏幕录像+ 官方说明只能在 AOSP 系的 ROM 上使用(谷歌官方、魔趣、SudaMod 等),各位国产 ROM 的同学建议做好准备再来尝试。
Google Play 上有个同类的 APP —— RecMe(这个怎么没被封杀……),不过试用之后发现它的内录同样是在录屏时听不到声音的,然后界面上屏幕录像+ 更胜一筹,所以没有推荐 RecMe。这个 App 倒没有说明哪些 ROM 可以使用,用着国产 ROM 的同学可以自己去 Google Play 下载试用一下。
文章来源于头条号:畅敏,版权归原创者所有,如有侵权请及时联系。
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点}

我要回帖

更多关于 比较好的录屏软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信