基于AWS Elemental MediaPackage的存储视频续看功能实现咨询
AWS环境下HLS视频续看功能实现方案
核心逻辑说明
你现有MediaPackage+CloudFront的HLS分发链路不需要做核心架构调整,续看功能本质是记录用户的观看进度偏移量+对应视频唯一标识,回显时定位到对应.ts分片位置拉流即可。
具体落地方案
1. 客户端进度采集
- 播放过程中每间隔10s、或者每次切换.ts分片时,记录三个核心字段:
视频唯一ID(asset_id)、当前观看时间偏移量(position,单位秒)、当前播放的.ts分片序号 - 客户端触发退出、暂停、页面卸载事件时,主动上报一次最新观看进度
- 若内容配置了DRM加密,同步记录对应内容的授权凭证标识,避免续看时权限校验失败
2. 进度存储方案
直接复用AWS原生服务即可,无需额外搭建第三方存储:
- 低并发场景:使用
DynamoDB存储用户观看进度表,主键设置为用户ID+视频ID,表字段包含观看时间偏移量、最后访问.ts分片序号、更新时间 - 高并发场景:先将上报的进度写入
ElastiCache(Redis)做缓存并设置过期时间,再异步同步到DynamoDB做持久化,避免大量上报请求压垮数据库
3. 续看时的流跳转实现
方案A:客户端拼接播放参数(推荐,无服务端改造量)
- 用户再次打开视频时,先从存储层拉取该用户对应视频的上次观看进度
- 绝大多数主流HLS播放器(hls.js、Video.js、AWS Amplify Video播放器)均支持
startTime参数,直接将记录的时间偏移量赋值给该参数,播放器会自动计算对应位置的.ts分片,跳过前置分片直接从目标位置拉流 - 若需要精准指定.ts分片,可直接给HLS的m3u8播放列表请求加查询参数
?start=xxxx(单位为秒),MediaPackage原生支持start查询参数,会自动返回从对应时间点开始的裁剪版m3u8列表,列表仅包含目标时间点之后的.ts分片,播放器加载该列表即可直接从对应位置播放
方案B:CloudFront边缘侧改写请求(对客户端完全透明)
如果不想调整客户端逻辑,可通过CloudFront Function在边缘层处理参数:
- 客户端请求m3u8文件时,将用户ID、视频ID放在请求头或者查询参数中携带
- CloudFront Function调用DynamoDB/Redis查询对应用户的观看进度,给转发到MediaPackage的m3u8请求加上
start参数,MediaPackage返回裁剪后的播放列表直接回传给客户端即可
4. 注意事项
- MediaPackage的HLS端点默认开启
start time支持,无需额外配置 - 针对直播转点播的内容,增加视频总时长校验逻辑,避免存储的进度超过当前视频总长度导致播放失败
- 服务端接收进度上报时增加合法性校验,拦截客户端上报的异常超大进度值
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

