视频记录是一件很麻烦的事情,之前是将一段视频十等分,学生每看完其中的一等分,在用户做相关操作的时候就会上传其中的几等分视频记录,相关操作包括:
- 暂停视频
- 观看下节视频
- 拖动视频
- 关闭当前页面
调查
调查了一下几个视频网站的记录方式,如下:
优酷
log 接口 : http://yt1.mmstat.com/yt/vp.vtslog
发送频率: 5
秒
body 日志 :
1 | version: 0.5.78 |
腾讯视频
log 接口 : https://apd-be31beb59d7da6eff28fb4bb69f24c0d.v.smtcdns.com/varietyts.tc.qq.com
发送频率: 不定时发送,打包一起发送
body 日志 :
1 | index: 23 |
Bilibili
log 接口 : https://api.bilibili.com/x/report/web/heartbeat
发送频率: 15
秒
body 日志 :
1 | aid: 34926550 |
爱奇艺
log 接口 : https://sb.scorecardresearch.com/p
发送频率: 10
秒
body 日志:
1 | c1: 2 |
小结
定时日志
上述的几个平台中除了 爱奇艺 传的数据太多,其他都很精简,总结一下关键信息我准备设计成如下几个字段:
- 视频id
- 当前用户id
- 定时上传次数 index
- 随机数 random
- 视频开始位置
- 视频结束位置
- 开始时间戳
- 结束时间戳
- 播放倍速
- 播放设备平台
- 日志类型 :timing
日志包整理好了,就看日志日志发送频率了,除了腾讯视频 应该是有专门收集日志,有个统一的触发机制,一次性发送了多条日志,其他网站都是以单位时间的频率发送给服务端,考虑到实施的简便性,综合几个发送频率,暂定频率为 10
秒。随机数 random
每次打开视频都刷新,可以区分不同的 log
的日志链,定时上传次数 index
可以检查一段 log
的完整性。
我们的单个视频平均时长在15分钟
,那么如果有一次发送log日志失败对总体进度影响是
1 | 15 * 60 =900 s |
为了一次日志失败对总体进度的影响,所以频率确定为 5
秒,但是相对来说,数据库的需要的储存空间也需要扩大一倍
1 | 15 * 60 =900 s |
单条数据丢失对整体影响也直接降低一半。
操作日志
上面的几家平台都有做操作日志的记录,这里唯一添加一个 random
字段,取值和定时日志每次生成的随机值相同,这里操作日志分为以下几类
开始
- 视频id
- 当前用户id
- 随机数 random
- 时间戳
- 视频位置
- 播放设备平台
- 日志类型 :start
暂停
- 视频id
- 当前用户id
- 随机数 random
- 时间戳
- 视频位置
- 播放设备平台
- 日志类型 :pause
完成
- 视频id
- 当前用户id
- 随机数 random
- 时间戳
- 视频位置
- 播放设备平台
- 日志类型 :complete
退出
- 视频id
- 当前用户id
- 随机数 random
- 时间戳
- 视频位置
- 播放设备平台
- 日志类型 :exit
拖动
- 视频id
- 当前用户id
- 随机数 random
- 视频原有位置
- 视频现有位置
- 时间戳
- 播放设备平台
- 日志类型 :drag
倍速
- 视频id
- 当前用户id
- 随机数 random
- 视频原有倍速
- 视频现有倍速
- 时间戳
- 视频位置
- 播放设备平台
- 日志类型 :speed
实施
- 客户端每次将日志发送到服务端
- 如果成功,则本次日志提交结束
- 如果失败,则客户端需要将日志存储在本地
- 等待时机合适,重新提交日志
- 如果成功,删除本地存储日志,本次日志提交结束
- 如果失败,重复第
4
步