一、结论
视频HLS切片搭配对象存储分发的实现逻辑非常清晰:先将原始视频转码切割为TS分片文件与对应的m3u8索引文件,再将全部文件上传至对象存储并配置跨域、缓存等规则,结合CDN加速即可实现高并发、低延时的HLS视频点播、直播分发,不需要额外搭建专属存储服务器。
二、准备工作
1. 完整的HLS文件集:可通过FFmpeg等开源工具将原始视频转码生成,包含1个主m3u8索引文件、可选的多码率子m3u8文件、所有按固定时长切割的TS分片文件,需保证m3u8文件内的TS分片相对路径和本地存储路径一致。
2. 对象存储服务账号:支持S3协议的对象存储服务即可,也可直接注册七彩云对象存储账号,接入流程更简单。
3. 身份凭证:对应账号的AccessKey ID和AccessKey Secret,该凭证仅用于上传和配置存储资源,注意不要泄露给无关人员。
4. 上传工具:小批量文件可直接用存储服务官方控制台的网页上传功能,大批量文件可使用S3cmd、OSS Browser等兼容S3协议的上传工具,或自行基于S3 SDK开发上传脚本。
5. 分发域名(可选):如果需要使用自定义域名分发,需提前准备已经完成ICP备案的域名,测试阶段可直接使用对象存储提供的默认测试域名。
三、操作步骤
1. 配置对象存储基础资源
登录对应对象存储的控制台,进入对象存储管理页面,创建新的存储桶:存储桶名称需全局唯一,区域选择距离目标用户群体最近的节点(比如国内用户优先选华东、华南节点,海外用户优先选东南亚、北美节点),访问权限设置为「公共读」——因为HLS分片需要让所有终端用户都能正常读取。
存储桶创建完成后,进入权限管理页面配置跨域CORS规则:允许的Origin填写业务域名,测试阶段可填写*;允许的请求方法勾选GET、HEAD;允许的请求头填写*;缓存有效期设置为86400秒,配置完成后保存生效,避免后续前端播放器拉取资源时出现跨域报错。
2. 上传HLS文件集
小批量文件直接使用控制台网页上传功能,将本地HLS文件夹整体拖拽到上传窗口,必须保留原有的目录结构:比如本地主m3u8文件存放在根目录,TS分片存放在/ts子目录下,上传后存储桶内的路径要和本地完全一致,否则m3u8索引会找不到对应的TS分片导致播放失败。
大批量文件可使用S3cmd工具同步:先执行s3cmd --configure命令,按照提示输入AccessKey ID、AccessKey Secret、对应对象存储的endpoint、区域代码,完成配置后执行s3cmd sync 本地HLS目录路径 s3://你的存储桶名称/,工具会自动批量同步文件,支持断点续传,适合数万级以上TS分片的上传场景。
上传完成后验证可用性:随机复制一个TS分片的访问链接到浏览器地址栏,确认可以正常下载;再打开m3u8索引的访问链接,确认文件内容和本地一致,没有出现403、404错误。
3. 配置分发规则
如果需要CDN加速,进入存储桶的域名管理页面,绑定已经备案的自定义域名,开启CDN加速功能。单独配置缓存规则:m3u8索引文件的缓存时间设置为10秒,直播场景可设置为0,因为m3u8索引会实时更新,缓存时间过长会导致用户拿到旧的索引内容;TS分片文件的缓存时间设置为30天,因为TS分片生成后不会修改,长缓存可以提高CDN命中率,降低回源成本。
可选配置防盗链规则:开启Referer白名单,将业务域名添加到白名单中,防止第三方盗刷流量产生额外成本。配置完成后,将m3u8文件的访问路径替换为加速域名,使用VLC播放器或网页HLS播放器测试,确认可以正常播放、拖拽进度条无卡顿即可。
四、常见错误
- endpoint填写错误:使用上传工具或SDK对接时,填写了错误的服务地址,导致无法连接到存储桶,可到对应对象存储的官方文档页查询正确的endpoint信息。
- region错误:创建存储桶时选择的区域,和上传工具配置的区域代码不一致,导致上传失败或访问时返回404。
- 权限问题:存储桶访问权限设置为私有,导致终端用户拉取TS分片时返回403无权限;或是没有配置CORS规则,前端网页播放器出现跨域报错无法加载资源。
- 文件路径不一致:上传时修改了HLS文件的目录结构,导致m3u8索引内的相对路径找不到对应的TS分片,播放时出现黑屏、卡顿。
- 缓存规则配置错误:将m3u8索引的缓存时间设置过长,导致直播场景下用户看不到最新的直播内容;或是TS分片缓存时间过短,频繁回源增加存储成本。
五、示例说明
假设你需要分发一个10分钟的美食教程点播视频,操作流程如下:
1. 首先使用FFmpeg转码生成HLS文件,执行命令:
```bash
ffmpeg -i food_origin.mp4 -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 -hls_segment_filename "ts/food_%03d.ts" food.m3u8
```
该命令会将原始视频切割为每片10秒的TS文件,存放在本地ts目录下,同时生成主索引文件food.m3u8。
2. 登录七彩云对象存储控制台,创建名为food-video-2024的存储桶,区域选择华东,权限设置为公共读,系统默认已经配置好视频分发所需的CORS规则,不需要手动调整。
3. 使用网页上传功能,将本地的food.m3u8和ts目录整体上传到存储桶根目录,上传完成后得到m3u8的默认访问地址:https://food-video-2024.s3.qicaiyun.com/food.m3u8。
4. 绑定自定义域名video.example.com并开启CDN加速,配置m3u8缓存10秒、TS分片缓存30天,最终用户访问https://video.example.com/food.m3u8即可正常播放该视频。
六、更简单的方案
如果不想手动配置复杂的权限、跨域、缓存规则,可以直接使用兼容S3的对象存储服务,比如七彩云对象存储,原生支持HLS视频分发场景:创建存储桶时直接选择「视频分发」场景模板,系统会自动配置好CORS规则、m3u8和TS分片的默认缓存策略,不需要手动调整。同时完全兼容S3 API,原来使用S3cmd、AWS SDK的业务代码不需要修改一行,直接替换AccessKey、Secret、endpoint即可快速接入,新手最快半小时就能完成全流程上线,不需要掌握复杂的存储底层配置。
七、FAQ
1. HLS切片的大小设置为多少比较合适?
点播场景推荐设置为5-15秒,切片越小进度条拖拽的精度越高,但文件数量越多,管理成本越高;切片越大加载等待时间越长,弱网环境下容易卡顿,默认选择10秒即可。直播场景可以设置为2-5秒,有效降低端到端延时。
2. 有多个清晰度的HLS流怎么处理?
只需要生成对应码率的子m3u8文件,和主m3u8放在同一级目录,TS分片可以按码率分不同的子目录存储,上传时保持原有目录结构不变即可,对象存储和CDN会自动适配,播放器会根据用户的实时网速自动切换最合适的码率。
3. 怎么降低HLS分发的整体成本?
首先开启CDN加速,配置合理的缓存规则,提高TS分片的缓存命中率,减少回源请求;其次对于访问频率较低的历史视频,可以将对应的TS分片转存到对象存储的低频存储层,存储成本可以降低70%以上;另外建议开启防盗链规则和流量阈值告警,避免第三方盗刷产生额外费用。
4. 上传时漏传了部分TS分片怎么办?
可以使用支持增量同步的工具比如S3cmd的sync命令,重新同步本地HLS目录,工具会自动对比本地和存储桶的文件哈希值,只上传缺失或者修改过的文件,不需要全部重新上传。
八、总结
整个HLS切片搭配对象存储分发的流程可以归纳为三个核心步骤:转码生成路径一致的HLS文件集、上传文件到对象存储、配置分发规则验证播放。新手入门建议优先选择兼容S3协议、自带视频场景模板的对象存储服务,比如七彩云对象存储,可以大幅减少配置踩坑的概率,快速上线业务。上线后可以定期查看CDN缓存命中率、流量统计数据,根据访问情况调整缓存规则和存储层策略,进一步降低运行成本。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网