为什么直播相比短视频视频播放而言,会产生发热的情况呢? 第一反应是推拉流,随之而使用的硬解码等硬件相关的操作。在团队分享之后,想到我之前看到《直播疑难杂症排查》和《直播技术详解》这两篇系列文章,提纲非常好,于是决定总结一下,这几年在直播行业的经验问题,以形成自己的知识体系。很多的名词并没有过于深入去解释,算是一个大的提纲吧,每个点都值得深入~
直播技术
直播技术为视频大致流程我们都了解,用相机进行采集,压缩,编码后进行推流,经由cdn推流,观众端进行拉流,解码后播放。那么在详细的就是一些,采集数据如何编码进行压缩,封装,推流如何优化,延迟如何优化,丢帧策略,网络质量对分辨率大小变更的影响。
1.直播技术详解
我们列一些重要的节点
1.1 手机为什么会发热?
- 硬编码:GPU
- 软编码:CPU (手机发热)
1.2 什么是GOP?
- GOP: I帧(关键帧)和P帧结合。两个I帧之间的集合称之为GOP
1.3 音视频如何同步?
- 音频同步视频
- 视频同步音频 (普通)
- 外部起时钟.用于同步(连麦)
1.4 直播流程有哪些?
- 主播端:格式封装;Camera采集 –> 丢帧 –> CV –> 美颜 –>推流
- 推拉流: cdn
- 观众端:解协议-> 音视频解码-音视频同步-播放
1.5 什么是cdn ?
CDN:内容分发网络
- 大量并发
- 内容聚合(就近接入)
CDN 聚合原理:
- cdn 不同的服务商,地理位置节点优势不同,比如中国南部,北部,国内外不同公司不同的地理位置的cdn优势不同。这就需要我们进行优化,来降低费用。
- 主动分发。推流后,分发给所有cdn节点
- 冷启动,需要时拉取。类似于懒加载,该节点有需求时,才进行拉取。
- 1.6 直播中还有美颜等效果如何实现呢?
- Camera采集 –> 丢帧 –> CV –> 美颜 –> 编码。在编码时进行对采集数据进行编辑。这里的丢帧就是对采集数据进行压缩
- 其实总结起来就是,对采集的数据加入美颜的算法进行优化。
2.直播中疑难杂症解决
- 2.1 首开慢?
- DNS 解析慢,后面有dns优化
- cdn服务端线路原因
- 2.2 秒开优化?
- CDN 缓存边缘关键帧(可能是4s之前的GOP),播放端加快加载,减少回源延迟。秒开永远是前4s
- GOP 减少,低buffer播放
2.3延时高?
- 延时高就是主播端推流后,观众端需要一段延迟时间后才能看到
- 产生的原因
- 图像处理,比如画面剪裁、美颜、特效处理
- 视频编码/解码延时
- cdn 网络传输的延时
- 业务代码中的缓冲区
- 当然也会受网络抖动,慢等原因影响,同样可以根据网络状况来加快或者降低延时时间,这中间还会考虑到缓存,当网络卡段是,播放缓存buffer,优化体验。
2.4丢帧策略?
- 采集丢帧
- Android采集帧率不可指定具体值,所以要丢帧,否则帧率过大流量带宽和费用扛不住。
- 卡顿丢帧
- 视频卡顿时,需要丢帧来进行同步,也就是追延迟
- 采集丢帧
2.5 如何追延迟?
- 快追:延迟的帧全部丢掉。但这时候体验不太好。会产生卡一下的感觉。
- 慢追:根据时间差,逐步的丢帧,慢慢追上。体验稍好
2.5 码率自适应?
- 根据网络或者抖动的情况。自动降低码率,帧率,分辨率
- 分辨率遵循:快降慢升原则。
2.6 码率转换策略?
- 监控和调度,根据主播的开播情况(卡顿,直播流畅),智能调度最优码率配置。
2.7 推流如何平滑切换?
- 流切换时,cdn流地址不变,自己切。观众不需要重新拉流。
- 与此同时。客户端启2个推流器,切换成功后再停一个,进行平滑切换。
2.8 Buffer机制(网络优化)有哪些?
根据不同策略,不同的缓冲机制 。 缓冲时间不同。
秒开时。利用4s前得buffer来进行播放,达到最快时间打开直播的优化
2.9 DNS 如何优化?
- DNS 解析慢:提前完成播放域名->IP 地址的解析,并缓存起来
- ip 预存:将播放地址中的域名解析为对应的服务器 IP 地址;
- dns 备灾,一个ip地址失败时自动进行多域名切换。
2.10 卡顿如何判断?
- 存在buffer行为
- buffer 耗尽次数
- 卡顿判断:心跳次数 3/10;丢帧行为;观众拉流时间
2.11 如何消除回声?
- 回声一般出现在同时有音频的采集和播放的场景,比如:连麦互动、混音返听等等,采集到的音频通过扬声器又播放出来了,同时又被采集了进去,从而产生了回声或者啸叫声。
- 一般需要通过系统的回声消除 API,或者第三方回声消除库(如:speexdsp,webrtc 等)进行处理。很多 Android 机型硬件自带的回声消除效果并不是很好。
2.12 点播拖动不准?
- 目前市面上普遍做的不太好,包括tiktok 0.0
- 关键帧(GOP)间隔太大
- 直播丢帧
3.直播清晰度
有段时间,我对比了市面上所有直播公司的直播清晰度,发现就是很模糊,不思其解。这里也提到了,视频的画质,是由它的编码质量决定的,压缩得越「厉害」,画质损失就越严重,马赛克就越多。编码器最重要的五个参数:画质级别、码率、帧率、GOP 大小、码控方式。当然这里不考虑分辨率,分辨率作为最直观的因素不列为质量原因,肯定是越高越清晰,但是考虑到带宽,流量等等,基本一线厂商做法都一致。
3.1画质级别
- H.264 有四种画质级别,Baseline profile,Extended profile,Main profile,High profile。
- 级别越高,压缩的效果越好,但算法复杂度更高,导致功耗也更高。
3.2 码率
- 决定了视频被压缩的程度,码率越低,丢失的信息也就越多,画质也就越差。
- 但是,带来的好处是占用的网络带宽会比较小,容易在互联网上传输,不容易出现卡顿。
3.3 帧率
- 决定了视频的流畅性,帧率越高,视频越流畅,但每秒钟编码器要处理的数据量也就越大,同等码率下压缩出来的视频质量就越差。
3.4 GOP 大小
- 决定了视频的延时,GOP 越小,延时就越小,但 GOP 小带来的问题是关键帧数量多,数据量变大,因此,同等码率下压缩出来的视频质量就会越差。
3.5 码控方式
- 一般编码器都有固定码率(CBR) 和 动态码率(VBR) 两种码控方式,前者是指码率优先,为了保证码率尽可能稳定,会主动降低画质,因此容易出现马赛克,后者是指画质优先,会优先保证画质,减少马赛克,但码率会浮动很大。
3.6 当然,还有一个重要的因素,就是编码器本身的实现质量,软编一般可以保证在不同手机上效果一致,而硬编则完全依赖手机所使用的硬件平台了。
4.手机发热
直播过程中手机发热严重,耗电快。发热严重的根本因素,无外乎就是一点:CPU/GPU 占用率高,所以,我们首先要分析下,哪些因素会导致 CPU/GPU 占用率高。
- 4.1 采集数据量太大
- 直播主要由:视频采集 -> 视频处理(剪裁、美颜、滤镜) -> 编码 -> 推流 这些环节组成。
- 在这整个流程中,决定数据量大小的因素有哪些呢 ?
- 视频的尺寸(例如:1280 x 720 的图像,明显要比 320 x 240 的图像处理起来费劲)视频的帧率(例如 每秒 30 帧,明显要比每秒 15 帧,处理起来费劲)
4.2 大量的格式转换
- 如 Android 摄像头出来的数据大多是 NV21 的,而编码器一般要求 I420 格式的数据;再比如 ffmpeg 解码的视频往往是 YUV 格式,而渲染显示往往需要 RGB 格式,等等。
- 我们要尽可能减少不同格式之间的数据转换,或者尽可能利用 GPU 来处理一些复杂的格式转换,比如利用 OpenGL 直接渲染 YUV 格式的数据,而不是用 CPU 做一次 YUV -> RGB 的转换,就是一个不错的选择。
4.3 解码
- 硬编码:GPU
- 软编码:CPU (手机发热)
- 软编/软解靠的是 CPU,非常耗性能,而硬编/硬解是使用专门的硬件编解码器模块,会显著降低 CPU 的负担,相对而言,会省电很多。
- 只不过需要小心各种 Android 机型兼容性问题,对于某些奇葩设备,还是加入硬编/硬解黑名单的好。
4.4 其他方面
- 当然,导致功耗高的因素还有很多,这里就不一一展开说明了,列举如下:
- 人脸识别/美颜/滤镜,对 CPU/GPU 消耗很大
- 代码逻辑中过多的 memory copy 操作
- 后台线程频繁唤醒手机访问网络或者读写 SDCard
- App 的一些动画特效