直播推流端弱网优化策略 | 直播 SDK 性能优化实践
弱网优化的场景
网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法。最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播。后来随着手机性能的提升和直播技术的进步,主播只需要有手机和有网络就可以直播。直播发展到现在,单一的室内聊天互动直播已经无法满足观众的需求。主播们开始走向户外,在更多的场景下直播。
在可以预见的未来,这种直播形式会快速发展。直播的内容会更优质,直播的形式也会从单纯的娱乐转向体验。
直播想延伸到户外需要克服很多困难,而最主要的困难就是应对不稳定的网络。移动网络下,通常容易遇到网络不稳定,连接被重置,断线重连,一方面频繁重连,建立连接需要开销。另一方面尤其是发生 GPRS/2G/3G/4G 切换时,带宽可能出现瓶颈。当带宽不够,帧率较高/码率较高的内容较难发送出去,这个时候就需要我们在不同网络状况执行不同的策略编码推流,让观众可以看到最优质的直播视频。
弱网优化的原理
思路一:
根据上行带宽的状况来调整码率、FPS、分辨率
弱网优化其实有一个概念性的东西,我们如何评价一个推流方案,它的弱网优化好不好?首先我们要知道三个概念,这个是和解码器相关的,码率(BitRate)、FPS(video frame per second)、分辨率(VideoSize)。
人们对视频流的感受集中在卡顿、模糊等消极的情况,在 UGC 、 PGC 的直播场景中,这些情况时常发生。直播推流对实时性的要求很高,为了保证实时性,在网络带宽不足或者上行速度不佳的情况下,都需要做出选择。要么选择更好的流畅度但牺牲清晰度(模糊),要么选择更好的清晰度但牺牲流畅度(卡顿)。当选定了一个分辨率后,推流过程中就不会对分辨率做变更,但可以对码率和 FPS 做出调节,从而达到上述两种情况的选择。

通过这个关联,我们就可以容易的知道该如何从技术层面做出调整。在追求更好的流畅度时,我们可以适当降低码率。如果 FPS 已经较高(如 30)时,可以维持 FPS 不变更;如果此时因码率太低而画面无法接受,可以再适当调低 FPS。在追求更清晰的画质时,可以提高码率,FPS 调节至 24 左右人眼大多还会识别为流畅。如果可以接受有轻微卡顿,那么可以将 FPS 设置的更低,比如 20 甚至 15。
总之,这三者之间一起构建了画面清晰和视频流畅的感觉,但最终参数是否能满意需要不断调整和调优,从而满足产品层面的需求。
思路二:
通过高压缩比的编码技术,比如:H.265
当然动态调整编码策略是一种应对方式,而直接提高视频流的压缩比降低直播对网络的要求也是一种策略。目前如果使用 H.265 编码就可以降低 40% 的带宽占用。但是目前的在手机直播上用 H.265 编码还有很多的问题要解决。比如 H.265 编码对移动端来说性能开销过大,相继会带来的问题还有发热过高、掉电过快等问题。
七牛在弱网优化上做了什么
很显然弱网优化在目前多样化的直播行业中是一个非常有用功能,所以七牛直播云的 SDK 也在这方面做出了大量的努力,下面可以分享下思路和效果。
根据大量客户的反馈定制优秀的弱网优化策略
所谓弱网优化的本质是一种策略。而弱网优化的效果取决于以下两点:
1)更精确和细粒度的检测网络的状况,便于推流端 SDK 调整参数。
2)更丰富的策略和更合理的选择。当 SDK 精确的反馈了网络的状况,我们需要做出正确的判断选择出一种合适的策略来应对。
要做到以上两点,就需要有大量的用户反馈来验证策略的可靠性和效果。七牛直播云已经通过了很多客户的验证,而且集成七牛直播推流 SDK 时不需要做任何的配置,默认就会打开这个功能。
极其优秀的优化效果
弱网优化报告-iOS
测试目标:比较七牛和某著名直播 App 在弱网下的直播表现
测试范围:七牛 iOS 推流 demo 、某著名直播 App
测试策略:使用 atc 弱网工具模拟 10%的丢包率的网络,同时使用七牛 demo 和某著名直播 App 直播时钟走时 5 分钟,并使用 SrsPlayer 播放(播放器参数相同),分别查看播放效果,统计卡顿次数。
测试结果:好网丢包率 10% 的情况下,七牛 iOS 的表现稍优于某著名直播 App 的 iOS 端。

弱网优化报告-Android
测试目标:比较 Android 端七牛和著名直播 App 在弱网下直播的表现
测试范围:七牛 Android 推流 demo、某著名直播 App 的 Android 端
测试策略:分别从限制上下行和设置丢包率的角度进行弱网的模拟。具体设置的弱网环境,见以下内容。
使用 atc 弱网工具分别模拟 3G 网和好网下 10% 丢包率的网络,同时使用七牛 Android 推流 demo、某著名直播 App 的 Android 端、直播时钟走时 5 分钟,并使用 SrsPlayer 播放,分别查看播放效果,统计卡顿次数。
测试结果:
3G 弱网丢包率 0 的情况下,七牛 Android 的表现优于某著名直播 App 的 Android 端。
好网丢包率 10% 的情况下,七牛 Android 的表现稍优于某著名直播 App 的 Android 端。
测试数据:
3G 网络:
1)3G 网丢包率 0(上行 420 Kbps,下行 850 Kbps):

2)好网丢包率 10%:

结语
弱网优化在直播领域是一个非常值得深挖的功能。虽然网络质量一直在升级,但是观众的要求也会越来越高。如何根据网络状况动态变化调整到最佳观看体验码流是一门艺术。
这里还可以展开更前沿的展望,比如我们把动态调整的策略做成一个放在云端的库。而每个终端会反馈弱网优化策略的使用结果,这些海量的结果数据可以通过机器学习建模出更优质的策略,最后把这些策略又回馈到各个终端。
直播无疑是 2016 年的大热话题,七牛云在 6 月底发布了实时流网络 LiveNet 和直播云解决方案后,我们用《直播技术详解》系列文章系统地介绍了直播各个环节的关键技术,帮助视频直播创业者们更全面、深入地了解直播技术,更好地技术选型。
《直播 SDK 性能优化实践》系列文章是介绍七牛云在直播 SDK 上的技术创新实践。欢迎探讨。
本文作者:@七牛云 pili 技术团队
直播推流端弱网优化策略 | 直播 SDK 性能优化实践的更多相关文章
- 手游录屏直播技术详解 | 直播 SDK 性能优化实践
在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...
- 百度APP移动端网络深度优化实践分享(三):移动端弱网优化篇
本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<三>弱网优化>,感谢原作者的无私分享. 一.前言 网络优化解决的核心问题有三个 ...
- 网络QoS的平衡之道——音视频弱网对抗策略介绍
作者:网易智企云信资深音视频引擎开发工程师 王兴鹤 随着AI和5G的到来,音视频应用将变得越来越广泛,人们对音视频的品质需求也越来越高,视频分辨率已经从高清发展为超高清.VR,视频帧率也已出现60fp ...
- fiddler抓包-7-C端弱网测试
前言大家平时也会发现我们有时候在地铁.高铁.电梯等等某个时候网络信号比较差导致网络延迟较大,这时是否有友好提示呢?甚至有可能发生崩溃等等...所以我们是可以通过fiddler来对web.APP.PC客 ...
- Mysql优化系列之查询性能优化前篇3(必须知道的几个事实)
事实一:临时表没有任何索引 最常见的临时表莫过于在from子句中写子查询,遇到这种情况,Mysql会先将其查询结果放到一张临时表中, 然后将这个临时表当做普通表对待 事实二:执行计划优化 大多数的sq ...
- Android优化—— Google 发布 Android 性能优化典范
阅读目录 0)Render Performance 1)Understanding Overdraw 2)Understanding VSYNC 3)Tool:Profile GPU Renderin ...
- sqlite3 多线程和锁 ,优化插入速度及性能优化
一. 是否支持多线程? SQLite官网上的"Is SQLite threadsafe?"这个问答. 简单来说,从3.3.1版本开始,它就是线程安全的了.而iOS的SQLite ...
- Android性能优化之UI渲染性能优化
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 本篇博客主要记录一些工作中常用的UI渲染性能优化及调试方法,理解这些方法对于我们编写高质量代码也是有一些帮助的,主要内容包括介绍CPU,GPU的职 ...
- 移动端 CPU 的深度学习模型推理性能优化——NCHW44 和 Record 原理方法详解
用户实践系列,将收录 MegEngine 用户在框架实践过程中的心得体会文章,希望能够帮助有同样使用场景的小伙伴,更好地了解和使用 MegEngine ~ 作者:王雷 | 旷视科技 研发工程师 背景 ...
随机推荐
- Git命令总结
本文转载自345大神.... 查看原文 先上个图形化界面GIT工具 SourceTree下载链接 windows版 1.8.3 & Mac版 2.2.4 链接: http://pan.baid ...
- JavaScript正则表达式,你真的知道?
一.前言 粗浅的编写正则表达式,是造成性能瓶颈的主要原因.如下: var reg1 = /(A+A+)+B/; var reg2 = /AA+B/; 上述两个正则表达式,匹配效果是一样的,但是,效率就 ...
- J a v a 的“多重继承”
接口只是比抽象类“更纯”的一种形式.它的用途并不止那些.由于接口根本没有具体的实施细节——也就是说,没有与存储空间与“接口”关联在一起——所以没有任何办法可以防止多个接口合并到一起.这一点是至关重要的 ...
- Kafka副本管理—— 为何去掉replica.lag.max.messages参数
今天查看Kafka 0.10.0的官方文档,发现了这样一句话:Configuration parameter replica.lag.max.messages was removed. Partiti ...
- 【转】外部应用和drools-wb6.1集成解决方案
一.手把手教你集成外部应用和drools workbench6.1 1. 首先按照官方文档安装workbench ,我用的是最完整版的jbpm6-console的平台系统,里面既包含j ...
- 在redis中使用lua脚本让你的灵活性提高5个逼格
在redis的官网上洋洋洒洒的大概提供了200多个命令,貌似看起来很多,但是这些都是别人预先给你定义好的,但你却不能按照自己的意图进行定制, 所以是不是感觉自己还是有一种被束缚的感觉,有这个感觉就对了 ...
- MySQL Workbench建表时 PK NN UQ BIN UN ZF AI 的含义
[转自网络]https://my.oschina.net/cers/blog/292191 PK Belongs to primary key 作为主键 NN Not Null 非空 UQ Uniqu ...
- 用SecureCRT连接虚拟机中的Linux系统(Ubuntu)
今天突然练习linux命令行的时候,想在window中联系linux命令行.经过一番dudu找到了一个不错的的工具(SecureCRT--意思安全)就是用SSH链接linux主机.推荐大家使用.毕竟w ...
- 分享一个php的启动关闭脚本(原)
自己简单写的一个php服务的启动脚本和大家分享 思路(实现的原理): 1:function模块+case语句多分支判断 2:通过添加# chkconfig: 2345 43 89注释实现开机自启动(前 ...
- SQL Server 索引和表体系结构(非聚集索引)
非聚集索引 概述 对于非聚集索引,涉及的信息要比聚集索引更多一些,由于整个篇幅比较大涉及接下来的要写的“包含列的索引”,“索引碎片”等一些知识点,可能要结合起来阅读理解起来要更容易一些.非聚集索引和聚 ...