手游录屏直播技术详解 | 直播 SDK 性能优化实践

时间:2022-04-07 06:19:01

在上期《直播推流端弱网优化策略 》中,我们介绍了直播推流端是如何优化的。本期,将介绍手游直播中录屏的实现方式。

直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用领域。手游直播就是现在常见的一种新兴应用场景。手游直播与一般直播最大的不同点,同时也是它的技术难点,在于录屏技术。游戏玩家录屏功能,实时地把自己玩游戏的场景分享展示给其他观众。录屏给很多游戏制作平台和直播内容平台提供了一种新的产品思路。

录屏实现的四个步骤:

  1. 采集:获取屏幕采集的视频数据、麦克风采集的音频数据、游戏内置的音频数据。

  2. 处理:转化成可以推流的标准格式,防止推出的流有问题。

  3. 编码:处理好硬编支持,节省终端的性能开销。

  4. 封包、推流:和普通的直播方式一样处理。

从以上的录屏步骤来看,录屏直播和普通直播的采集源发生了变化。而真正实现录屏直播功能,则需要我们获取到数据,处理成能更稳定编码、推流的格式,最后才能稳定高质量地推出视频流。

iOS 的录屏思路简述

  • ReplayKit

ReplayKit 是苹果 iOS 10 以上版本提供的用于录屏并对外直播的功能。简单而言就是苹果通过这个功能把采集到的屏幕视频信息和音频信息回调给开发者,开发者可以任意处理这些信息。

但是问题是,ReplayKit 使用上限制较多,首先要求系统必须为 iOS 10 以上;其次,被录屏的 App 必须支持 ReplayKit 功能。这也很容易理解,毕竟录屏是比较敏感的行为。所以必须游戏本身支持,以表示被录制方已经同意录屏。

熊猫 TV 作为国内首家支持 ReplayKit Live 的直播平台,开创了直播行业的先河。熊猫 TV iOS 上的录屏方案采用七牛提供的 ReplayKit 方案实现。

  • Airplay Mirroring

Airplay Mirroring 是苹果用于屏幕投影的功能,投屏的原理就是把设备的屏幕数据和音频数据通过 Airplay Mirroring 协议传输给第三方的支持该协议的显示播放设备。但 Airplay Mirroring 是苹果的私有协议,传输过程中音视频数据都是被苹果加密的,不对第三方开放。因此要想获得这些数据,只能通过破解协议的方式来达成。

 优缺点分析

手游录屏直播技术详解 | 直播 SDK 性能优化实践

 

Android 的录屏思路简述

  • View.getDrawingCache() 方法

通过 View 的 cache 内容获取到 Bitmap 对象来达到录屏的效果。但是很多手机上面该方式会存在性能问题,另外该方式并不是一个真正意义上的录屏方式,另外部分 View 组件的内容并不能获取到,比如 webview 。

  • 读取 /dev/graphics/fb0 方法

Android 基于 Linux,所以可以通过读取 fb0 设备节点,即 framebuffer 中的帧数据来实现屏幕的录制。但是读取这个设备节点需要 root 权限。

  • screencap -p xxx.png/screenshot xxx.png 方法

screencap 是 Android shell 的命令,可以通过该 shell 命令读取到屏幕的帧数据来达到录屏的功能。但该命令仍然需要 root 权限。

  • MediaProjection + VirtualDisplay (>= 5.0) 方法

在 Android 5.0 以后,Google 开放了截屏的接口,可以通过「虚拟屏幕」来实现录屏。该方式是目前 PLDroidMediaStreaming 采用的方式。

七牛 iOS ReplayKit 的录屏方案

手游录屏直播技术详解 | 直播 SDK 性能优化实践
1. 游戏端自己要实现 ReplayKit 被录制端的协议;

2. 录制平台集成最新版本的七牛直播 SDK ;

3. 录制平台创建 Broadcast Upload Extension,让支持 ReplayKit 的游戏可以被录制;

4. 添加推流管理类,拿到 ReplayKit 数据后推流出去。

iOS ReplayKit 录屏方案 demo

手游录屏直播技术详解 | 直播 SDK 性能优化实践

七牛 Android 的录屏方案

1. 更新最新版本的七牛直播 SDK ;

2. AndroidManifest.xml 注册 ;

<activity

android:name="com.qiniu.pili.droid.streaming.screen.ScreenCaptureRequestActivity"

android:theme="@android:style/Theme.Translucent.NoTitleBar" >

</activity>

  

3. 使用七牛提供的核心类 ScreenStreamingManager、ScreenStreamingManager 封装屏幕的录制、音频的采集,编码,封包和推流操作。用户只需要简单的调用相关 API 即可实现录屏推流。

手游录屏直播技术详解 | 直播 SDK 性能优化实践

在当你想在自己的产品中加入录屏直播功能,那么需要考虑清楚到底是自研还是使用三方的 SDK。如果采取自研方案,那么可以参考以上的录屏思路,你还需要仔细了解系统平台的 API 介绍。如果采用第三方 SDK 则可以较快集成,但需要了解 SDK 稳定性和易用性,且仔细阅读 SDK 的使用细则。


直播无疑是 2016 年的大热话题,七牛云在 6 月底发布了实时流网络 LiveNet 和直播云解决方案后,我们用《直播技术详解》系列文章系统地介绍了直播各个环节的关键技术,帮助视频直播创业者们更全面、深入地了解直播技术,更好地技术选型。

《直播 SDK 性能优化实践》系列文章是介绍七牛云在直播 SDK 上的技术创新实践。欢迎探讨。

本文作者:@七牛云 pili 技术团队

手游录屏直播技术详解 | 直播 SDK 性能优化实践的更多相关文章

  1. 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

    ​关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...

  2. 直播推流端弱网优化策略 &vert; 直播 SDK 性能优化实践

    弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...

  3. PHP写在线视频直播技术详解

    2016年7月22日 22:26:45 交流QQ:903464207 本文会不断更新 废话一句,如果你要做高性能服务器服务,请去读底层的东西 http tcp/ip socket 了解基础协议,你对如 ...

  4. MySQL配置文件my&period;cnf中文详解附mysql性能优化方法分享

    Mysql参数优化对于新手来讲,是比较难懂的东西,其实这个参数优化,是个很复杂的东西,对于不同的网站,及其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系,优化不可能一次性完成,需要不断的 ...

  5. &lpar;转&rpar;MySQL配置文件mysql&period;ini参数详解、MySQL性能优化

    本文转自:http://www.cr173.com/html/18331_1.html my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数 ...

  6. MySQL配置文件mysql&period;ini参数详解、MySQL性能优化

    my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数. my.ini分为两块:Client Section和Server Section.  ...

  7. CDN学习笔记二(技术详解)

    一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...

  8. CDN技术详解及实现原理

    CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精 ...

  9. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

随机推荐

  1. Mongodb使用

    Mongodb基本的原则是:条件句是内层文档的键,修改器是外层文档的键[即,修改器要修改的字段声明在修改器内部].1.$size,用于查询数组大小为size的记录db.a.find({"co ...

  2. JavaScript之怎样获取元素节点

    JavaScript获取元素节点一共有三种方法,分别是通过元素ID.通过标签名字和通过类名字来获取: 1.通过元素ID属性的ID值来获得元素对象-getElementById() DOM提供了一个名为 ...

  3. Effective Java &lpar;7&rpar; - 避免终止方法

    一. 基本概念 1. 所谓的终结方法事实上是指finalize(). 2. Java的垃圾回收机制仅仅负责内存相关清理.其它资源的清理(释放文件.释放DB连接)须要程序猿手动完毕. 3. 调用Syst ...

  4. 转:loadrunner经典面试题

    在LoadRunner中为什么要设置思考时间和pacing 答: 录制时记录的是客户端和服务端的交互,如果要精确模拟 用户的行为,那么客户操作客户端时花费了很多时间要怎么模拟呢?录入 填写提交的内容, ...

  5. 认识J2SE

    1. J2SE的定义 J2SE:全称为Java 2 Standard Edition.Java 2平台包括:标准版(J2SE).企业版(J2EE)和微缩版(J2ME)三个版本. J2SE主要包括UI. ...

  6. Maven:常用命令

    1, 将第三方的jar包安装到本地仓库中 mvn install:install-file -Dfile=**/*.jar -DgroupId=XXX -DartifactId=YYY -Dversi ...

  7. lua 语言基础

    1.数据类型: string(字符串) ·运算符“+.-.*./”等操作字符串,lua会尝试讲字符串转换为数字后操作: ·字符串连接用“..”运算符 ·用“#”来计算字符串的长度(放在字符串前面) · ...

  8. 一名全栈设计师的Mac工具箱(设计&comma;开发&comma;效率)

        我喜欢把自己定义为一个会一些设计的全栈工程师.在一些大型企业项目中,我一般担任架构师的角色,而到了我自己负责的个人或开源项目中,我就成了一名全栈设计师.我喜欢用自学而来的那些设计技能进行网站或 ...

  9. &period;NET Core2&period;0 使用EF做数据操作

    原文链接:https://www.cnblogs.com/chrisluo/p/7500462.html

  10. redis存储数据的时候

    使用redis存储数据的时候,有时候为了查看的方便,通常会有层级或者说是目录, 这时候我们在set的时候,需要将key值使用“:”的符号来区分层级关系,比如:set(“a:b”, “123”),那么在 ...