视频直播APP架构设计
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
YUV
软编 FFMpeg / X264 / Xvid
iOS PCM 编码
降噪⻨ 克 ⻛ 风
硬编
Audio采集
AudioT oolBox
PCM
AAC
软编
收 音 ⻨ 克 ⻛ 风
FFMpeg(libfdk-aac)
Android H.264 音视频编码
Y 兼容硬编?
N
MediaCodec
FFMpeg
HEVC(H.265)
直播+
喷气功能
开播通知 开启喷气模式
组播通知 送礼物! 看进度
后端服务
喷气设备上线
开喷
敏捷开发
敏捷
1)测试包周期:每天 2)小版周期:1-2周 3)大版周期:4周 4)自动打包:Jenkins + OCLint + Fireline 5)Crash和卡顿检测:Bugly、听云、自研Hook
发包质检
2)首包到达
3)首个关键帧画面
时间范围 0 - 0.5 秒
用 户 点 击 到 首 帧 时 ⻛ 统 计
发生生次数(总次数6397) 266 2429 2503 713 251 102 133 平均时⻛ 0.434317s 0.763168s 1.370519s 2.387648s 3.427744s 4.452670s 5.234122s 比 例 例 4.15% 37.97% 39.12% 11.14% 3.91% 1.59% 2.07%
Android.Camera
Android
AudioRecord 采 集 ⻨ 克 ⻛ 风
视频处 理
GPUImageView (主播预览) GPUImageFilter YUV/RGB 美颜滤镜 贴纸 3D道具 瘦脸 大 眼 AR/VR GPUImageFilter GPUImageFilter GPUImageFilter
播放器器(内存)预 热
直播间
线程控制
多线程中心心
提示和通知疯狂广广播!
CPU
礼物疯狂连击! 各种 WebView!
MEM
动画疯狂播放!
Timer
公屏疯狂滚动刷新!
iOS卡顿监控
CFRunLoop
kCFRunLoopBeforeSources
时间差1
kCFRunLoopBeforeWaiting
恢复音画采集
重新推流
重新获取推流地址
重新推流
中心心转码
主播推流 边缘接 收节点
高 可 用 GW 中 心 心 节点 转 码
3s
20ms
边缘分发 节点
20ms-2s
20ms 600ms
20ms
20ms
边缘分发 节点
20ms-2s
边缘转码
边缘分发 节点 边缘转码 节 点
2 0 20ms-2s
主播推流
高 可 用 GW 中 心 心节 点
APP 卡顿率:1%
头像、封面:20k 内存泄露率:10%/小 时整 体CPU峰值:60%
APP 温度控制平均温度: 60 ℃
直播技术指标
直播流首帧延迟均值:500ms 推流稳定性:95% 直播流丢包率/丢帧率:2% 回音消除、去噪 直播流卡顿率:1% 美颜、道具、贴纸 CPU占 用 :20%
硬编硬解覆盖率:99%
直播和连⻨延迟:1.5s
来电、通知、网络切换自动恢复 推
流CPU占用均值:50%
黑黑屏、绿屏、画面卡死:1‰
观众端CPU占用均值:30%
开播基本流程
采集
处 理
编码
封包
推流
采集
Camera 封装 YUV/RGB、PCM AVCapture (AVFoundation)
iOS
YUV/RGB、PCM
丢弃音频帧
音 频Buffer
外部监听防护
监听压后台
监听来电
监听断网
监听网络切换
取消前台播放
直播 静 音
开始后台播放
友好提示
4G <-> WiFi
状态显示播放
APP保活 网络恢复 友好提示
来电结束
取消后台播放
移除状态栏显
恢复 声 音
重连直播 恢复前台播放
重连公屏
重连直播
重连公屏
播放质量统计
1)点击播放
异步线程 dispatch_semaphore_t (with CFRunLoopObserverRef )
kCFRunLoopAfterWaiting
时间差2
连⻨
APP连⻨
MCU 列 列表同步 回音消除、转 推直播流
业务服 务器器
查询最佳 MCU节点
连⻨A 广广播状 态 心心
RTMP-A
MCU 连⻨中 FLVA
协议
TCP⻛连接(慢) HTTP⻛ 连 接 HTTP短连接 HTTP短连接
首帧
较慢 快 很慢 快
延迟
1-3s
1-3s 8-10s 1-3s
秒开
主动 GOP 预热 (最佳)边缘节点 拉取关键帧
转 码 中 心心
DNS预解析 找近点
预拼接流地址 GSLB
解码
Video Buffer 目 目标解 码 音视 频流 Picture Buffer
舍弃参考帧
Buffer
视听保持流畅,画质有保障!
还同时解决音视频同步问题!
拉流
拉流
解码
渲染播放
多种清晰度
CDN-A
360p + 400kb/s
504p + 800kb/s
CDN-B
720p + 1000kb/s
协议对 比
应用范围
RTMP
HTTP-FLV HLS MP4 推流、拉流 拉流 H5、录流回放 录屏、小视频
内存优化都得定期扫实时络探测线路择优好路优先复cdnb边缘cdnb边缘cdna边缘cdna边缘cdna中心节点cdnb中心节点我要看主播a我要看主播a我要看主播b我要看主播bcdn多路互通推流动态配置名称范围默认值特殊情况帧率824fps15fps关键帧25s4s视频码率4001000kbps800kbps200kbps音频码率kbps分辨率360p480p504p720p504p全局配置户级配置个别系统配置监听来电暂停推流压后台来电结束恢复推流监听压后台静音推流保流不断恢复前台恢复音画采集监听断络恢复重新推流友好提示中断推流监听络切换4gwifi中断推流重新获取推流地址重新推流推流外部监听防护心转码20ms3s20ms20ms2s20ms2s600ms边缘接收节点20msgw20ms边缘分发节点边缘分发节点边缘转码近点分发20ms3s20ms20ms2s20ms2s600msgw20ms边缘分发节点边缘分发节点络检测动态码率动态丢帧动态码率发不出去推流缓慢发送卡顿buffer累积yes
推流 CDN-A 中 心心 节 点 CDN-A 边缘 我要看主播A
主播A CDN-A 边缘 我要看主播A
千帆流媒体中心心
CDN-B 边缘
我要看主播B
推流
CDN-B 中心 心 节点
CDN-B 边缘
我要看主播B
主播B
推流动态配置
名称 帧率 关键帧 视频码率 范围 默认值 特殊情况
8-24fps
2-5s 400-1000 kbps ~ 360P、480P、504P、720P
RTMP 转 HTTP-FLV,H.265 反而而会快一些,而而且压缩比提高!
如果不涉及编码转换的话,H.265 也挺快! “高”转“低”比较快,“低”转“高”就很慢,H.264 转 H.265 会慢上5-6倍! 得同时输出 RTMP、HTTP-FLV、HLS 及其扩展版,支支持 H.265 !
推流
编码
美颜
:无美颜,不直播! 占用 CPU 资源
美白
磨皮 皮
补光
可爱贴纸
瘦脸
影响编码效率
主播回显延迟增大
编码封装
FLV
H.264
AAC
H.264 编码
I
P
I
B
P
I
GOP
iOS H.264 编码
硬编
VideoToolBox (VTCompression) 封装 H.264 (CMSampleBuffers)
20ms
20ms 600ms
20ms
3s m s
近点分发
边缘分发 节点
20ms-2s
弱网窄带推流
动态码率
网络检测
动态丢帧
动态码率
No:重新调高码率
重连 网络不稳定
推流缓慢 发送卡顿
累积
Buffer
大码高帧 发不出去
包太多?
窄带
Yes:赶紧降码儿!
动态丢帧
降低编码功耗! 减少传输数据量!
关键帧和音频帧
/anchor/search /anchor/search /audience/admin/forbid/isDeviceForbid.andr /audience/admin/forbid/isDeviceForbid.andr /audience/chat/isSecret.android /audience/chat/isSecret.android
4)卡顿开始
5)卡顿结束 6)播放结束
0.5 - 1.0 秒
1.0 - 2.0 秒 2.0 - 3.0 秒 3.0 - 4.0 秒 4.0 - 5.0 秒 5.0秒以上
APP启动优化
主线程 异步线程
检查网络
Application 初始化
Loading
复杂UI、动态libs、SDK
主UI
下载缓存开屏广广 告
推流技术流程
转码中心心
封包(元信息、时序)
RTMP
H.264
LibRTMP
RTMP CDN 源站 HTTP-FLV
AAC FFMpeg
HLS
推流稳定性
时刻考虑如何省电、省带宽! 缩减动画,缩减特效,保CPU,保GPU! 内存优化都得 定期扫一遍! 实时网络探测,线路择优,好路子优先复用!
CDN 多路互 通
QFPlayer (without buffer)
解 复 用
基于时序同步控制
音频 解码
Audio Buffer
Sample Buffer
播 放 器 器 缓 冲 队 列 列
Buffer
播放端弱网 临时缓冲
主播端弱网 延迟累积 追帧
追帧
视频 Buffer 丢弃 P帧、B帧
基于时序同步控制
Yes 包延迟超过阈值?
动态埋点
根据控件路径 生生成唯一标识
提前手动圈 选和记录 添加当前版本的业务ID 与事件ID的映射关系 EventID + 版本号 <—> StatID
上报所有 EventID 日志
原始 日志
清洗池
解析 与映 射
Hi ve
统 计
D B
图片&动画
图片优化
子线程队列 列
封面下 载
控制并发
自动裁剪 修正
1)直播间加载时⻔ 统计
2 )首 ⻔ 与直播间网路请求抓包统计
5)推流稳定性和压测报告
6)APP启动时间报告
3)CPU、内存、带宽使用报告
4)卡顿与崩溃情况报告
7)各统计项/动态埋点统计
8)接口模拟丢包、劫持、数据破坏容灾报告
发版流程
1)开发确认
2)QA每日报告
6)全⺠ showcase
7)UI 细节对照完善 8)上线报告 9)站内灰度、渠道灰度 10)全量发布
3)全员测试
4)技术指标统计 5)产品确认
1)直播技术指标 2)优化开播流程
8)做好质量统计 9)直播间优化
3)采集和音视频处理优化
4)编码封包优化 5)推流转码高可用 6)拉流秒开
10)搭建连⻨等上层应用
如何快速创新?
11)接口和数据优化 12)图片和动画优化 13)直播+(物联网)
7)解码缓冲
14)敏捷开发
1)直播技术指பைடு நூலகம் 2)优化开播流程
8)做好质量统计 9)直播间优化
3)采集和音视频处理优化
4)编码封包优化 5)推流转码 高可用 6)拉流秒开
10)搭建连⻨等上层应用
视频直播APP架构设计
开直播
看直播 玩直播
千帆直播
2015.10
2016.01
2016.05
2016.10
2017.04
直播基本交互
整体技术指标
直播间进入速度:300ms 聊天接入速度:500ms 白 屏 和 DNS被劫持率:1% DNS解析时间:100ms 一次连 ⻨成功率 : 9 9 % 点播视频打开速度:300ms APP 整体崩溃率:5‰
864 918
11389 11443 427 478 368 422
1417 1469
11957 12009 1016 1065 920 972
441 735
353 410 81 102 98 136
/activity/work/v2/mywork.android /activity/work/v2/mywork.android
15fps
4s 800 kbps ~ 504P 1 200 kbps 5 kbps
音频 码率
分辨率
全局配置
用户级配置
个别系统配置
推流外部监听防护
监听来电 监听压后台 监听断 网 监听网络切换
暂停推流压后台
静音推流
保流不断
友好提示
中断推流
4G <-> WiFi
来电结束
恢复前台
网络恢复
中断推流
恢复推流
Cache
去重
主线程
监控图片大小
监控尺寸
监控缓存
动画优化
1)序列列帧 -> WebP -> BPG ? 2)大礼物分段加载,分段播放 3)热⻔ 礼物提前打包 4)降低分辨率,限宽不限高 5)减少实时计算量,缓存中间计算结果
6)尽量用整型替代浮点型计算
7)减少GC次数 8)尽量用硬件加速,发挥GPU性能
TRUE FALSE
TRUE FALSE TRUE FALSE TRUE FALSE
553 551
568 566 589 587 552 550
host https TRUE FALSE request_size response_size 563 13545 561 13599 total_size 14108 14160 time(ms) 148 169 url /activity/star/v1/rankAll.android /activity/star/v1/rankAll.android
CD N
RTMP-B
FLV-B
连⻨B
痛点
1)连⻨稳定性
2)播放器器内存消耗,CPU消耗
3)两路流,带宽压力,码率不高导致画质问题
4)多路连⻨扩展,音频连⻨?
5)网络抖动导致延迟 - 本地编码
接口数据
数据接口请求流程
后端SOA
接口合并层 后端SOA 版本控制 Encrypt Compress
Htttps & Http/2.0 ?