视频直播技术(五):移动端实现录屏推流的方案
一、录屏推流实现的步骤
1. 采集数据
主要是采集屏幕获得视频数据,采集麦克风获得音频数据,如果可以实现的话,我们还可以采集一些应用内置的音频数据。
2. 数据格式转换
主要是将获取到的视频和音频转换成常见的推流的标准格式,这样能保证让观看终端正常观看。
3. 编码处理
如果不进行编码的话,数据量会非常大,这样不仅浪费带宽,而且会浪费观看终端的性能,所以需要对音视频数据进行编码处理。
4. 封包&推流
这块的逻辑可以采用和普通的直播方式进行封装和推流。
总结:其实录屏推流直播和普通的直播的区别就是采集源发生了变化,而在技术层面来将真正需要我们做的事情就是将录屏获取到的数据处理成稳定的编码格式。
二、Android 实现录屏功能的思路
Android 实现录制屏幕的功能的技术方案现阶段主要为以下两种:
1、Android5.0以下,获取root权限使用 adb shell screenrecord 命令功能进行录制。
2、Android5.0以上,使用系统Api功能:MediaProjection 和 VirtualDisplay。
目前的主流实现和使用的思路为: MediaProjection + VirtualDisplay 方法。
这两种方式其实在底层的实现机制是一样的,因为在5.0之前,Google可能介于录制屏幕功能具有一定的危险性,所以就没有开放此功能。在Android 5.0 发布后,谷歌开放了截屏的接口,我们可以通过VirtualDisplay来实现录屏的视频源数据的获取。
注:此API在Android 6.0之前存在UI漏洞,具体可参见:https://blog.csdn.net/jiangwei0910410003/article/details/52135654。
在编写App的时候,如果不想某些应用的页面被录屏软件捕捉,可以在所在页的代码中添加WindowManager.LayoutParams.FLAG_SECURE 属性。
1. 使用命令行录制屏幕
在Android 5.0 以下,我们截屏可以使用 adb shell screencap 命令,录制屏幕可以使用 adb shell screenrecord。
这里我们讲一下录制屏幕的命令行的使用方式:
(1). 基本使用
adb shell screenrecord /sdcard/demo.mp4
命令说明:录制手机屏幕,视频格式为mp4,存放到手机sd卡里,默认录制时间为180s。
(2). 限制录制时间
参数: –time-limit
adb shell screenrecord --time-limit 10 /sdcard/demo.mp4
命令说明:限制视频录制时间为10s,如果不限制,默认180s
(3). 指定视频分辨率大小:
参数: –size
adb shell screenrecord --size 1280*720 /sdcard/demo.mp4
命令说明:录制视频,分辨率为1280*720,如果不指定默认使用手机的分辨率,为获得最佳效果,请使用设备上的高级视频编码(AVC)支持的大小
(4). 指定视频的比特率:
参数: –bit-rate
adb shell screenrecord --bit-rate 6000000 /sdcard/demo.mp4
命令说明:指定视频的比特率为6Mbps,如果不指定,默认为4Mbps. 你可以增加比特率以提高视频质量或为了让文件更小而降低比特率
备注:
1. 此录制方式不支持声音,需单独录制。
2. 此命令使用需要Root权限,很大程度上限制了使用。
3. 随着Android的版本不断升级,我们更建议使用MediaProjection类来进行屏幕录制。
2. 使用 MediaProjection+VirtualDiaplay录制屏幕
// TODO