直播技术小结

Posted by Jfson on 2019-05-12

为什么直播相比短视频视频播放而言,会产生发热的情况呢? 第一反应是推拉流,随之而使用的硬解码等硬件相关的操作。在团队分享之后,想到我之前看到《直播疑难杂症排查》和《直播技术详解》这两篇系列文章,提纲非常好,于是决定总结一下,这几年在直播行业的经验问题,以形成自己的知识体系。很多的名词并没有过于深入去解释,算是一个大的提纲吧,每个点都值得深入~

直播技术

参考文章《直播技术详解》系列文

直播技术为视频大致流程我们都了解,用相机进行采集,压缩,编码后进行推流,经由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 的一些动画特效

pv UV: