一、结论
将转码生成的m3u8索引文件和.ts切片文件按统一目录结构整理后,批量上传到配置好跨域、缓存、权限规则的对象存储Bucket,即可对外提供稳定的HLS音视频点播/直播分发服务,全程无需搭建额外的存储服务器。
二、准备工作
1. 已开通对象存储服务的账号,可选择七彩云对象存储,兼容S3协议且接入门槛低,适合新手快速上手。
2. 获取账号的AccessKey ID和AccessKey Secret,这是调用对象存储接口的身份凭证,需妥善保管避免泄露。
3. 已完成转码的HLS相关文件,包括1个或多个m3u8索引文件、全部.ts切片文件,若为多码率HLS需包含各码率对应的子索引文件。
4. 上传工具,新手推荐使用可视化工具Cyberduck、Rclone,有开发能力的用户可使用Python、Go等语言的S3兼容SDK。
5. 提前明确业务场景的权限要求,公开点播内容可配置公共读权限,付费/私有内容需使用签名鉴权访问。
三、操作步骤
步骤1:创建并配置对象存储Bucket
1. 登录对象存储控制台,比如七彩云对象存储控制台,点击「新建Bucket」,输入符合命名规范的Bucket名称(仅支持小写字母、数字和短横线),选择离目标用户最近的区域,存储类型选择「标准存储」(HLS文件属于高频访问资源,不建议选归档或低频存储)。
2. 配置Bucket权限:公开点播场景选择「公共读」,私有内容场景选择「私有」,关闭「禁止覆盖上传」开关(直播场景需要频繁更新m3u8文件,必须关闭)。
3. 配置跨域资源共享(CORS):进入Bucket设置页的「跨域规则」模块,新增规则:允许源填写前端播放器所在的域名(测试可填*,生产环境建议填具体域名),允许Methods勾选GET、HEAD,允许Headers填写*,暴露Headers填写Content-Length、ETag,缓存过期时间填3600秒,保存规则。
4. 配置缓存策略:进入「缓存配置」模块,新增两条缓存规则:第一条匹配后缀.m3u8,缓存TTL设置为60秒(直播场景可设置为10秒);第二条匹配后缀.ts,缓存TTL设置为7天或更长,减少回源带宽消耗。
步骤2:整理本地HLS文件结构
1. 新建一个以视频ID为名称的文件夹,比如course_001,所有和该视频相关的HLS文件都放在这个文件夹内,避免和其他视频的文件混淆。
2. 若为单码率HLS,直接将m3u8索引文件和所有.ts切片放入该文件夹即可,不需要额外建子目录。
3. 若为多码率HLS,在course_001文件夹下新建hd、sd、ld三个子文件夹,分别对应高清、标清、流畅三个码率,将对应码率的子m3u8文件和.ts切片放入对应子文件夹,主m3u8索引文件放在course_001根目录下。
4. 检查所有文件的命名,确保没有中文、空格或特殊字符,避免上传后出现404错误。
步骤3:批量上传文件并验证
1. 以上传工具Rclone为例,先在Rclone配置文件中新增对象存储配置块:type设为s3,provider设为Other,access_key_id和secret_access_key填写之前获取的凭证,endpoint填写对应区域的 endpoint(可在七彩云Bucket概览页复制官方地址,不要自行拼写),acl根据权限要求设置为public-read或private。
2. 执行上传命令,比如本地文件存放在./course_001目录下,执行rclone copy ./course_001 qicaiyun:你的Bucket名称/,等待上传完成,Rclone会自动校验文件完整性,漏传或传输出错会自动重试。
3. 上传完成后,在控制台找到主m3u8文件,复制其访问链接,用VLC播放器或浏览器HLS播放器打开测试,拖动进度条验证所有切片都能正常加载,确认没有卡顿或404错误。
四、常见错误
- endpoint填写错误:不同区域、不同厂商的对象存储endpoint不同,填错会导致连接失败或上传后无法访问,解决方法是直接在控制台Bucket概览页复制官方提供的endpoint,不要自行修改拼写。
- region错误:创建Bucket时选择的区域和上传工具中填写的region不一致,会出现签名校验失败或找不到Bucket的错误,解决方法是上传时填写和Bucket创建时完全一致的region标识。
- 权限问题:私有Bucket未给访问链接加签名导致播放器返回403,或CORS规则配置错误导致浏览器端播放器跨域请求被拦截,解决方法是检查Bucket权限配置,私有场景生成带签名的临时访问链接,CORS规则要覆盖所有播放器所在的域名。
- 目录结构错误:m3u8文件内的切片路径为相对路径,但上传时修改了目录结构,导致播放器找不到.ts切片,解决方法是上传时保持和本地完全一致的目录结构,不要随意移动m3u8或ts文件的位置。
- 缓存规则错误:m3u8文件缓存时间设置太长,直播场景下用户拉取到旧的索引文件导致播放失败,解决方法是直播场景将m3u8的缓存TTL设置为10秒以内,甚至关闭缓存。
五、示例说明
我们以一个15分钟的在线课程视频为例,转码后生成单码率HLS资源,包括1个playlist.m3u8文件和30个.ts切片(每个切片30秒)。
1. 首先在七彩云对象存储控制台创建名为online-course-hls的Bucket,区域选华东1,权限设为公共读,选择内置的「HLS音视频存储」场景模板,系统自动完成CORS和缓存规则配置。
2. 本地新建文件夹course_1002,将playlist.m3u8和30个.ts切片全部放入该文件夹,检查所有文件名都是英文和数字,没有特殊字符。
3. 用Rclone配置七彩云S3连接,endpoint填s3.huadong1.qicaiyun.com,region填huadong1,输入AK和SK,执行rclone copy ./course_1002 qicaiyun:online-course-hls/上传。
4. 上传完成后,访问地址为https://online-course-hls.s3.huadong1.qicaiyun.com/course_1002/playlist.m3u8,复制到VLC播放器测试,拖动进度条所有切片都能正常加载,播放流畅无卡顿。
六、更简单的方案
如果不想手动配置复杂的规则、适配S3接口,可以直接使用兼容S3的对象存储服务,比如七彩云对象存储,它完全兼容标准S3 API,市面上所有支持S3的上传工具、播放器SDK、音视频处理服务都可以直接对接,无需修改代码。控制台还提供HLS场景一键配置模板,创建Bucket时选择对应的场景,系统会自动完成CORS规则、缓存策略、访问权限的最优配置,不需要手动逐一调整,新手最快10分钟就能完成全流程配置,同时自带全球CDN加速节点,HLS播放加载速度比普通对象存储快30%以上,适合中小团队快速落地音视频业务。
七、FAQ
1. HLS的m3u8和ts文件必须存放在同一个Bucket吗?
没有强制要求,但强烈建议存放在同一个Bucket的同一目录下。因为HLS的m3u8索引文件默认使用相对路径指向.ts切片,如果分散存放在不同Bucket,需要手动修改m3u8内的所有切片路径为绝对路径,不仅增加工作量,还容易出现路径写错、跨Bucket权限校验失败等问题。如果确实需要跨Bucket存储,需确保所有.ts切片的访问权限和m3u8一致,且路径配置准确。
2. 私有Bucket内的HLS文件怎么安全对外分发?
有两种常用方案:一种是生成带签名的临时访问链接,给m3u8和所有.ts切片都生成有效期符合业务需求的签名链接,适合小流量、低并发的场景;另一种是搭配CDN的URL鉴权功能,比如七彩云对象存储自带的CDN支持时间戳鉴权、参数鉴权等多种方式,只需在CDN侧配置鉴权密钥,前端按照规则生成带签名的访问链接即可,不需要单独给每个文件生成签名,适合高并发的大规模音视频业务。
3. HLS切片数量多,批量上传时怎么避免漏传、错传?
第一优先选择支持断点续传、完整性校验的上传工具,比如Rclone、Cyberduck、七彩云官方控制台上传工具,这些工具会自动对比本地文件和云端文件的MD5值,确保文件上传一致;第二上传完成后,可以通过控制台的文件列表统计当前目录下的文件数量,和本地的文件数量对比,确认数量一致;第三可以随机抽取几个后续的.ts切片,单独访问测试是否能正常加载,避免前面的切片上传成功、后面的漏传导致播放中途卡住。
4. 直播场景的HLS切片存储需要做特殊配置吗?
需要,和点播场景有两点差异:第一是m3u8文件的缓存时间要设置得非常短,建议设为5-10秒,甚至设置为不缓存,因为直播场景的m3u8是动态更新的,缓存时间太长会导致用户拉取到旧的索引文件,出现播放失败、卡顿的问题;第二是要开启Bucket的覆盖上传权限,因为直播过程中会不断生成新的.ts切片和更新m3u8文件,需要允许覆盖已有的同名文件,避免上传失败。
八、总结
整体操作流程可以归纳为「配置Bucket→整理文件→批量上传→测试验证」四个核心环节,只要按步骤操作,新手也能快速完成HLS文件的对象存储部署。建议优先选择兼容S3协议、有场景化配置能力的对象存储服务,比如七彩云对象存储,能大幅减少配置错误的概率,提高部署效率。上传过程中要注意保持目录结构和本地一致,避免路径错误导致播放异常,私有内容一定要做好权限控制,不要随意开启公共读权限,避免内容被盗用、流量被盗刷造成损失。如果后续需要做音视频转码、截图、审核等处理,也可以直接使用对象存储配套的数据处理服务,不需要额外搭建转码服务器,进一步降低运维成本。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网