最近公司有项目涉及到直播,于是做了个简单的了解和测试,在此写点心得体会,以作备忘。
1. 直播的主要特点和分类
一般常见的直播有如下类别:
1)培训式直播
2)秀场式直播
3)实时会议式直播
其主要特点如下:
视频源 | 是否需要美颜 | 是否需要动态合成道具 | 实时性要求 | 是否需要服务端合成流 | 是否需要多窗口播放 | |
培训式直播 | 本地设备屏幕或者PPT窗口等 | 一般不需要美颜;但需要考虑动态合成背景 | 需要在画面上实时显示教辅工具的效果 | 一般延时在2-3秒内都可以接受 | 通常不需要,服务端仅需要处理录制即可 | 不需要 |
秀场式直播 | 本地摄像头实时画面 | 必须实时提供必要的美颜功能,比如美白、廋脸、磨皮等,高级的可以提供动态化妆、变声等 | 可以考虑提供一些辅助效果,比如常见的兔耳朵、猫胡须等 | 大部分观众延迟在2-3秒内,极少连麦观众延迟应在毫秒级 | 通常不需要,服务端仅需要处理录制即可 | 多人互动时需要 |
实时会议式直播 | 本地摄像头实时画面为主,但本地设备屏幕也需要提供 | 一般不需要美颜;可考虑提供动态合成背景 | 可以考虑提供一些简单的辅助工具,比如绘制箭头、打圈、画重点等 | 通常要求在毫秒级 | 通常需要 | 需要 |
2. 直播影响用户体验的关键点
1)音视频源提供和终端播放的流畅度
2)最终延时时长
3)美颜效果的自然程度
4)对于带宽和设备资源的消耗
5)其他配套业务效果
3. 技术关键点
1)整体音视频流的传输和交互方案
常见的传输方案有单向且有延时的RTSP/RTMP/FLV等,也有双向且时延较低的WebRTC,或者自定义其他私有传输方案
2)本地屏幕视频源抓取
方案很多,比如直接屏幕录制,比如GDI层面截图,比如显存层面信息抓取,比如操作系统图像子系统(Windows下的DX等)信息抓取,比如第三方工具直接使用,如ffmepg等。
不同方案的编码复杂度、性能、兼容性等均存在差异,应灵活判断作出选择。
3)主播端推流方案
常用的有RTSP/RTMP推流,或者WebRTC推流
4)美颜方案
美颜有开源算法,也有各大厂商提供现成的SDK,SDK价格主流在10-30W左右,顶级价格超百万。
5)服务端流转发方案
可以自行编写媒体转发服务,也可以直接使用各大厂商提供的集成服务,或者使用开源的方案比如nginx+RTMP等
6)服务端合流方案
可以自行实现,也可以直接使用一些开源实现或者大厂实现;不过基本上都离不开ffmepg
7)道具方案
可以在主播端推流时,根据道具信息,在视频层进行合成;也可以在服务端进行合成;
或者道具作为外部效果,将其UI在观众端与视频进行图层叠加展示
8)观众端播放方案
有单路播放、多路播放之分;有服务端合流和播放端合流之分;有基于SDL的,也有基于UI展示控件的;有CPU解码的,也有GPU解码的
9)整体控制
需要额外考虑:开始直播观看时的超短时长启动、观看端时移、静音、锁屏保护、录制和监管、网络抖动优化、自动帧率/码率优化、旁路讲解合成等
4. 实现
若拟采用大厂的现场实现方案,可选大致有:声网、腾讯、263等
具体实现demo,留档于gitee。