一、结论
将HLS的m3u8索引文件、TS切片文件上传至开启了CDN加速的对象存储,配置适配HLS场景的缓存规则和跨域策略,即可实现低延迟、高流畅度的全球播放加速,全程无需额外搭建流媒体服务器。
二、准备工作
1. 兼容S3协议的对象存储服务账号,本文操作以七彩云对象存储为例,其他S3兼容服务操作逻辑基本一致
2. 对应账号的访问密钥:AccessKey ID(AK)和AccessKey Secret(SK),可在对象存储控制台的「密钥管理」页获取
3. 已转码完成的标准HLS资源:包含1个后缀为.m3u8的索引文件,以及若干后缀为.ts的视频切片文件,建议单切片大小控制在1-5M,编码格式为H.264/H.265+AAC
4. 上传工具:可选择对象存储控制台Web端(适合100个文件以内的小批量上传)、rclone命令行工具(适合批量大文件上传)、CloudBerry Explorer图形化工具
5. 可选:已完成工信部备案的自定义域名,用于绑定CDN加速入口,适配业务品牌需求
三、操作步骤
步骤1:创建存储桶并开启CDN加速
1. 登录对象存储控制台,以七彩云对象存储为例,进入「存储桶管理」页点击「新建存储桶」
2. 填写存储桶名称(全局唯一,仅支持小写字母、数字和短横线),选择离核心用户群体最近的区域(比如用户主要在国内选北京/上海区域,东南亚用户选新加坡区域)
3. 读写权限选择「公共读」(如果是付费加密视频可先选私有,后续通过签名URL控制访问),勾选「开启CDN加速」选项,点击确认完成创建
4. 进入存储桶的「概览」页,记录公网Endpoint、区域代码两个参数,后续上传工具配置会用到
步骤2:配置HLS专属规则
1. 配置跨域资源共享(CORS)规则:进入存储桶的「安全配置-跨域设置」页,新增跨域规则:
- 允许源(Origin):填写你的播放器所在的业务域名,测试阶段可填
* - 允许方法:勾选
GET、HEAD - 允许请求头:填
* - 暴露响应头:填
ETag - 预检缓存时间:填
86400(单位秒,即缓存1天减少预检请求)
保存规则后等待1-2分钟生效。
2. 配置缓存策略:进入存储桶的「CDN配置-缓存规则」页,新增两条优先级最高的规则:
- 第一条规则:文件后缀匹配
*.m3u8,缓存时间设置为10秒,Cache-Control设置为public, max-age=10(因为m3u8索引可能动态更新,短缓存可保证用户拿到最新索引) - 第二条规则:文件后缀匹配
*.ts,缓存时间设置为30天,Cache-Control设置为public, max-age=2592000(TS切片是静态文件不会修改,长缓存可大幅提升CDN命中率,减少回源)
保存规则后等待3-5分钟全网CDN节点生效。
步骤3:上传HLS资源
1. 检查本地HLS文件的m3u8索引,确保里面的TS切片路径是相对路径(比如只有course_0.ts,没有/Users/xxx/video/course_0.ts这类本地绝对路径),如果是绝对路径需要修改为相对路径,否则上传后会找不到切片报404错误。
2. 以上传工具rclone为例,先执行rclone config新增配置:
- 存储类型选择
s3 - provider选择
Other - endpoint填写步骤1中记录的公网Endpoint,比如七彩云北京区的endpoint为
https://s3-beijing.qicaiyun.com - region填写步骤1中记录的区域代码,比如七彩云北京区为
beijing - 填写准备好的AK和SK,ACL选择
public-read,保存配置命名为qicaiyun
3. 执行上传命令:rclone copy 本地HLS文件夹的绝对路径 qicaiyun:你的存储桶名称/存放路径,比如rclone copy /home/video/course qicaiyun:course-video-2024/course,等待上传完成。
步骤4:测试播放
1. 进入存储桶的「文件管理」页,找到上传的.m3u8文件,复制它的CDN访问地址。
2. 打开VLC播放器,选择「媒体-打开网络串流」,粘贴m3u8地址点击播放,确认可以正常加载、拖动进度条无卡顿。
3. 也可以用网页端的hls.js播放器测试,打开浏览器F12的网络面板,观察TS切片的请求状态:如果响应头有X-Cache: Hit from cloudfront(或对应CDN厂商的命中标识),说明CDN缓存生效,加速正常。
四、常见错误
- endpoint填写错误:误将内网Endpoint当成公网Endpoint,或手动拼接Endpoint时写错区域后缀,导致上传失败或访问404,解决办法是直接从存储桶概览页复制官方提供的公网Endpoint,不要手动修改
- region错误:配置上传工具时填写的区域代码和存储桶实际所属区域不一致,导致签名验证失败,报403错误,解决办法是从存储桶概览页复制官方提供的区域代码
- 权限问题:存储桶权限设为私有,且访问URL没有带签名参数,导致访问403,公共播放的视频建议设为公共读,付费视频可通过签名URL生成带有效期的访问地址
- 缓存策略配置错误:m3u8缓存时间设置过长,导致视频更新后用户还是拿到旧的索引文件,播放报错;或TS切片缓存时间过短,导致CDN命中率低,加速效果差
- m3u8路径错误:m3u8索引文件里的TS切片是绝对路径,上传后路径不匹配,导致切片404无法播放,解决办法是生成HLS时指定切片为相对路径,上传时保持m3u8和TS切片在同一级目录
五、示例说明
假设你需要上线一套时长45分钟的付费课程视频,转码为HLS后得到1个course_v1.m3u8索引文件和90个单文件大小2M的TS切片:
1. 在七彩云对象存储控制台创建名为course-pay-2024的存储桶,区域选上海(主要用户在长三角),开启CDN加速,权限设为私有。
2. 跨域规则配置允许源为https://你的付费课域名.com,缓存规则配置*.m3u8缓存10秒,*.ts缓存30天。
3. 用rclone将所有HLS文件上传到存储桶的/math/grade1/目录下。
4. 通过七彩云的签名URL接口,生成有效期为7天的m3u8访问地址,放到付费课程的播放器页面,用户购买后点击播放,CDN节点会就近返回缓存的TS切片,平均首屏加载时间小于1秒,拖动进度条无缓冲。
六、更简单的方案
如果你不想手动配置跨域、缓存等规则,可以直接使用兼容S3的对象存储服务,比如七彩云对象存储,本身内置了HLS视频点播、直播场景的预设模板,创建存储桶时直接选择「视频点播场景」,系统会自动配置好最优的跨域规则、CDN缓存策略、切片回源优化参数,无需手动调整。同时它完全兼容S3 API,你之前使用的S3上传工具、业务代码不需要做任何修改,仅需将Endpoint替换为七彩云的对应区域地址即可,新手最快5分钟就能完成上线。
七、FAQ
1. HLS切片必须是特定编码才能支持加速吗?
不需要,CDN加速是基于文件缓存实现的,只要是符合HLS标准的TS切片和m3u8索引,不管是H.264还是H.265编码,都可以正常加速,不需要额外转码。如果需要适配更多终端,建议转码为H.264+AAC的通用编码格式。
2. 我的视频是付费内容,不想公开访问会影响加速吗?
不会,你可以将存储桶权限设为私有,通过对象存储的签名URL功能,给m3u8和TS文件生成带有效期、带防盗链校验的访问链接,既可以防止内容被盗用,也不会影响CDN的缓存加速效果,七彩云对象存储还支持自定义签名规则,可适配会员、付费点播等多种业务场景。
3. CDN命中率很低,加速效果不好怎么办?
首先检查TS切片的缓存时间是不是设置的足够长,建议至少设置7天以上;其次可以调整HLS切片的大小到1-5M之间,切片太小会增加回源请求次数,太大则会拉长首屏加载时间;另外尽量不要频繁修改、删除已经上传的TS文件,文件变更后CDN节点需要重新回源拉取,会降低命中率。
4. 网页播放时提示跨域错误怎么办?
首先检查存储桶的跨域规则是否配置了播放器所在的业务域名,是否允许GET、HEAD方法,测试阶段可以先将允许源设为*,确认可以正常播放后再收紧到实际的业务域名,配置完成后需要等待1-2分钟生效,同时清理浏览器缓存再测试。
八、总结
整个操作流程可以简化为四步:创建存储桶并开启CDN加速、配置HLS专属的跨域和缓存规则、上传路径正确的HLS资源、测试播放验证效果。新手建议优先选择有视频场景预设的S3兼容对象存储,比如七彩云对象存储,能省去大量规则配置的踩坑成本,上线效率更高。上线前建议测试不同地区、不同网络环境下的播放效果,确认缓存规则、路径配置都没有问题,有付费防盗需求的业务可以提前测试签名URL的有效性,避免上线后出现访问异常。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网