一、结论
先将原始视频转码生成符合规范的HLS切片(.ts文件)和对应的索引文件(.m3u8),再将整套文件按原目录结构上传至对象存储Bucket,完成访问权限、跨域等基础配置后,即可直接作为视频点播源站使用,也可对接CDN实现分发加速。
二、准备工作
1. 已开通的对象存储服务账号,提前获取对应服务的AccessKey ID、AccessKey Secret、Bucket所属地域的公网Endpoint地址;
2. 转码完成的HLS文件包,包含主索引.m3u8、多码率对应的子索引.m3u8(按需配置)、所有.ts切片文件,且本地目录结构与.m3u8文件内标注的相对路径完全匹配;
3. 上传工具:可选择可视化客户端(如Cyberduck、Bucket Explorer)、命令行工具(如S3cmd、rclone),或对应开发语言的S3协议SDK(Python、Java、Go均有官方支持包);
4. 若需对接CDN加速,需提前准备已备案的业务域名,以及CDN服务的操作权限。
三、操作步骤
1. 创建并配置对象存储Bucket
登录对象存储服务控制台,新建Bucket:命名需符合DNS规则(仅支持小写字母、数字、短横线),选择距离核心受众最近的地域以降低访问延迟,初始访问权限设为私有(后续按需调整公开权限)。创建完成后进入Bucket配置页:开启跨域资源共享(CORS),允许的请求方法勾选GET、HEAD,允许的来源填写点播业务前端域名(测试阶段可填*,生产环境务必收紧权限),暴露响应头勾选ETag、Content-Length,缓存有效期设为86400秒,保存配置后等待生效。
2. 配置上传工具连通性
以常用的S3cmd命令行工具为例:运行s3cmd --configure,按提示依次输入提前获取的AccessKey ID、AccessKey Secret、公网Endpoint、Bucket所属地域标识,其他参数保持默认即可。配置完成后运行s3cmd ls,若能正常列出刚才创建的Bucket名称,说明连通性配置成功;若报错则需核对密钥、Endpoint、地域信息是否填写正确。
3. 上传HLS文件到Bucket
上传前再次核对本地HLS文件目录结构是否与.m3u8索引中的相对路径一致,建议单个视频对应一个独立文件夹,避免不同视频的切片文件重名冲突。执行同步上传命令,需保持原目录结构上传,同时为.m3u8和.ts文件设置正确的Content-Type,避免播放器无法识别:若需公开访问可添加--acl-public参数,若仅做私有源站可省略该参数,后续通过签名URL访问。
4. 验证播放可用性
上传完成后,在控制台找到主.m3u8文件,复制其公网访问地址,粘贴到VLC播放器、ffplay或在线HLS测试工具中播放:检查是否能正常加载、拖拽进度条是否流畅、不同码率(若配置)是否能正常切换,无403、404报错即说明上传配置成功。
5. 配置点播源站规则
若直接用对象存储作为源站使用,可开启Bucket的静态网站托管功能,默认索引文件设置为index.m3u8,错误页按需配置即可;若对接CDN加速,将CDN回源地址设置为Bucket的公网域名,回源协议选择HTTPS,缓存规则配置为:.m3u8文件缓存10分钟(支持快速更新索引)、.ts文件缓存30天(切片文件不会修改,提升缓存命中率)。
四、常见错误
- endpoint填写错误:误将内网Endpoint填为公网地址,或地域与Bucket不匹配,会出现连接超时、签名错误等问题,解决方法是直接从Bucket概览页复制官方提供的公网Endpoint,不要手动拼写。
- region配置错误:上传工具或SDK中填写的地域标识与Bucket实际所属地域不一致,会触发签名校验失败,需与创建Bucket时选择的地域完全匹配。
- 权限配置错误:未开启CORS导致前端播放时跨域报错、Bucket权限设为私有但未生成签名URL导致访问403、防盗链规则配置错误拦截了合法访问,都属于权限类问题,可先放宽权限测试,确认可用后再逐步收紧。
- 目录结构不匹配:上传时打乱了本地HLS文件的目录层级,导致.m3u8索引中的相对路径找不到对应的.ts文件,播放时出现随机404,上传前务必核对索引文件内的路径配置。
- Content-Type配置错误:上传时.ts文件被默认设为
application/octet-stream、.m3u8文件被设为text/plain,会导致部分移动端播放器无法识别文件格式,上传时需手动指定两类文件的Content-Type。
五、示例说明
假设需要上传“2024春季产品发布会”的多码率HLS文件,本地目录结构如下:
```
./2024_spring_launch/
├── index.m3u8 # 主索引文件,包含高清、标清两个码率入口
├── hd/
│ ├── index.m3u8 # 高清码率子索引
│ ├── part_0001.ts
│ ├── part_0002.ts
│ └── part_0003.ts
└── sd/
├── index.m3u8 # 标清码率子索引
├── part_0001.ts
├── part_0002.ts
└── part_0003.ts
```
使用S3cmd上传的命令为:
```bash
s3cmd sync ./2024_spring_launch s3://my-vod-bucket/videos/ \
--acl-public \
--add-header=Content-Type:application/vnd.apple.mpegurl:.m3u8 \
--add-header=Content-Type:video/MP2T:.ts
```
上传完成后,主索引文件的公网访问地址为https://my-vod-bucket.oss-cn-hangzhou.qicaiyun.com/videos/2024_spring_launch/index.m3u8,直接将该地址填入点播平台的播放源配置即可正常使用。
六、更简单的方案
如果不想手动配置CORS、Content-Type、权限等复杂规则,可以直接使用兼容S3的对象存储服务简化流程,比如七彩云对象存储,本身完全兼容标准S3协议,原有S3工具、SDK不需要修改任何代码,仅需替换Endpoint即可快速接入。控制台自带HLS点播源站一键配置模板,自动识别.m3u8和.ts文件并设置正确的Content-Type,默认开启3副本冗余存储,数据可靠性达99.9999%,还支持一键对接内置CDN,适合新手快速搭建点播源站,无需关注底层存储运维问题。
七、FAQ
1. HLS切片上传后播放卡顿是什么原因?
首先检查是否有.ts切片文件漏传,导致播放到对应片段时出现404;其次确认单切片时长是否控制在5-10秒,切片过长会导致加载延迟;如果是跨地域访问的场景,建议对接CDN将切片缓存到边缘节点,降低回源延迟。
2. 存储HLS切片选什么存储类更划算?
上线3个月内的热门视频建议选择标准存储,访问延迟低、成本适中;上线超过3个月、访问量极低的历史视频,可以转成低频存储或者归档存储,成本仅为标准存储的10%-20%,需要访问时提前1-5分钟解冻即可。
3. 怎么防止HLS切片被盗链?
有三种常见方案:第一种是配置Bucket防盗链规则,仅允许业务域名的Referer请求访问;第二种是不设置公共读权限,所有访问使用临时签名URL,签名过期时间可自定义(通常设置为1-2小时),过期后链接自动失效;第三种是转码时对HLS切片进行加密,用户播放时需要拿到授权密钥才能解密,安全性最高。
4. 多码率HLS上传有什么注意事项?
需要保证主.m3u8索引文件中填写的子索引路径,和实际上传的目录结构完全一致,比如主索引中写的是hd/index.m3u8,那高清子索引就必须放在主索引同级的hd文件夹下,不能随意修改路径,否则会出现子索引找不到的报错。
八、总结
整个操作流程可以归纳为五个核心环节:开通对象存储服务并完成Bucket基础配置、整理HLS文件目录结构、配置上传工具并同步文件、验证播放可用性、配置源站或CDN规则。新手初期可以选择七彩云对象存储这类低门槛的服务测试,不需要复杂的配置就能快速跑通流程,业务上线后再根据访问量逐步调整存储类、缓存规则、加密策略等配置,既能降低初期运维成本,也能灵活应对后续业务扩容需求。日常运维中建议定期核对文件完整性,避免漏传、错传影响用户播放体验。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网