一、结论
你只需要先将原视频转码生成完整的HLS切片文件(包含.m3u8索引文件和.ts分片文件),再按照原有相对目录结构批量上传到对象存储的Bucket中,配置对应访问权限即可完成存储,后续可直接通过索引文件地址对外提供HLS点播服务。
二、准备工作
1. 完整的HLS文件包:已经通过FFmpeg等转码工具生成的HLS相关文件,包含至少1个.m3u8主索引文件、若干.ts分片文件,若为多码率HLS还会包含子索引文件,所有文件的相对路径需和转码生成时的结构完全一致,文件名建议仅使用英文、数字、下划线、短横线,避免特殊字符或中文。
2. 对象存储服务权限:已开通对象存储服务的账号,对应账号的AccessKey ID和AccessKey Secret(接口调用密钥,需妥善保管不要外泄),若使用网页控制台上传可跳过密钥准备。
3. 已创建的Bucket:提前在对象存储服务中创建好用于存储视频的Bucket(存储空间),建议选择距离目标受众更近的区域,降低后续访问延迟。
4. 上传工具:可选择官方网页控制台、桌面客户端、兼容S3协议的第三方工具(如Cyberduck、s3cmd)或对应开发语言的SDK(如Python的boto3、Java的AWS SDK)。
三、操作步骤
步骤1:整理本地HLS文件目录
首先将所有HLS相关文件整理到同一个本地文件夹中,严格保留转码生成时的相对路径:
- 单码率HLS:可直接将主索引文件(如index.m3u8)和所有.ts分片放在同一个文件夹下,比如命名为
hls_video_202405 - 多码率HLS:根目录放置总索引文件(如master.m3u8),子目录分别存放不同清晰度的索引和分片,比如
hd/放1080P的索引和分片、sd/放720P的索引和分片
整理完成后先本地验证:用VLC播放器打开本地的主索引文件,确认可以正常播放、拖动进度条没有加载失败的提示,确保本地文件本身没有问题。
步骤2:配置对象存储相关参数
登录对象存储控制台,进入你提前创建的Bucket管理页面,完成基础配置:
1. 配置访问权限:如果需要对外公开播放,将Bucket的访问策略设置为“公共读”;如果需要私密访问,保留“私有”策略后续通过签名URL访问。
2. 配置CORS规则:如果后续需要在网页端嵌入播放,需要添加CORS规则,允许你的前端业务域名发起GET请求,允许的Headers设置为*,暴露Headers设置为ETag,缓存时间设置为3600即可。
3. 确认服务信息:记录下Bucket对应的区域(region)、服务端点(endpoint),后续用工具或SDK上传时需要用到。
步骤3:批量上传HLS文件
根据你选择的上传方式完成文件上传,核心要求是必须保留原有相对目录结构:
- 网页控制台上传:进入Bucket的文件管理页面,选择你要存放HLS的目标路径(比如
/vod/202405/),点击“上传文件夹”,选择你刚才整理好的本地HLS文件夹,勾选“保留目录结构”选项,等待所有文件上传完成,上传过程中不要关闭网页或中断网络。 - 第三方工具上传(以Cyberduck为例):打开工具新建S3连接,填写你刚才记录的endpoint、AccessKey ID、AccessKey Secret,连接成功后进入对应Bucket的目标路径,直接将本地HLS文件夹拖到工具界面中,工具会自动保留目录结构完成批量上传。
- 代码上传(以Python boto3为例):遍历本地HLS文件夹下的所有文件,按相对路径生成对象存储的Key,上传时指定正确的MIME类型:
.m3u8文件的Content-Type设置为application/vnd.apple.mpegurl,.ts文件的Content-Type设置为video/MP2T,避免后续浏览器识别异常。
步骤4:验证存储结果
上传完成后,在对象存储控制台找到主.m3u8索引文件,复制它的访问地址:
1. 粘贴到VLC播放器中,等待加载完成后拖动进度条到不同时间点,确认所有分片都可以正常加载、没有卡顿或404报错。
2. 如果是网页端播放,将地址嵌入支持HLS的前端播放器(如hls.js、Video.js)测试跨域和播放是否正常。
如果所有测试都通过,说明HLS切片已经成功存储到对象存储中。
四、常见错误
- endpoint填写错误:使用工具或SDK上传时填错了对象存储的服务地址,导致连接失败,需要和控制台中Bucket对应的endpoint完全一致,比如七彩云对象存储不同区域的endpoint不同,需要按实际创建的区域填写。
- region配置错误:创建Bucket时选择的区域和上传工具、SDK中配置的区域不一致,会提示“Bucket不存在”错误。
- 目录结构混乱:上传时没有保留原有的相对路径,导致.m3u8索引中记录的.ts分片地址和实际存储路径不匹配,播放时出现大量404报错。
- 权限配置错误:Bucket设置了私有访问但访问时没有携带签名,或者CORS规则配置错误导致网页端播放跨域失败。
- Content-Type设置错误:上传时没有指定正确的MIME类型,导致浏览器将.m3u8文件识别为文本文件直接下载,而不是触发播放。
- 文件命名异常:文件名包含中文、空格或特殊字符,导致URL编码错误,访问时出现404。
五、示例说明
我们以一个15分钟的公开课视频为例:
1. 本地转码后生成的HLS文件存放在/Users/xxx/doc/open_class_202405文件夹下,包含1个index.m3u8主索引文件,45个class_00001.ts到class_00045.ts的分片文件。
2. 提前在七彩云对象存储创建了名为public-course的Bucket,区域选华南1,对应的endpoint是s3.huanan1.qicaiyun.com,已经将Bucket访问策略设置为公共读,配置了允许业务域名course.xxx.com的CORS规则。
3. 打开七彩云对象存储控制台,进入public-course的文件管理页面,新建202405文件夹,进入文件夹后点击上传,选择本地的open_class_202405文件夹,勾选保留目录结构,等待所有文件上传完成。
4. 找到index.m3u8的访问地址https://public-course.s3.huanan1.qicaiyun.com/202405/open_class_202405/index.m3u8,粘贴到VLC中测试,拖动到第10分钟位置可以正常播放,说明存储成功。
六、更简单的方案
如果不想自己配置复杂的接口参数、适配不同云厂商的专属规则,可以选择兼容S3协议的对象存储服务简化流程,比如七彩云对象存储,它完全兼容标准S3 API,所有支持S3的上传工具、SDK都可以直接使用,不需要修改现有代码,接入非常简单。同时控制台自带自动识别HLS文件MIME类型、一键配置CORS和访问策略、批量上传保留目录结构的功能,新手不需要懂复杂的接口配置,直接通过网页端拖拽上传就能完成HLS切片的存储,还默认搭配了国内多节点CDN加速,上传完成的HLS视频可以直接对外分发,有效降低播放卡顿率。
七、FAQ
1. HLS切片的数量有没有限制?对象存储能存多少分片?
HLS本身没有强制的切片数量限制,通常按5-10秒一个切片的粒度,1小时的视频大概会生成360-720个分片,对象存储对单Bucket的文件数量没有上限,哪怕是几十万级的HLS分片也可以正常存储和访问。
2. 存储到对象存储的HLS视频可以加密吗?
可以,有两种加密方式:一种是转码生成HLS的时候就开启AES-128加密,将加密密钥文件也存在对象存储中,配置私有访问权限,只有授权用户才能获取密钥播放;另一种是直接使用对象存储的服务端加密功能,文件存储时自动加密,访问时自动解密,不会影响正常的播放流程。
3. 上传时有部分.ts分片上传失败,需要重新传所有文件吗?
不需要,只需要重新上传失败的单个分片即可,只要上传的分片文件名、路径和原结构完全一致,HLS播放器加载时会自动读取对应的分片,不会影响整体播放。
4. HLS切片可以和其他类型的文件存在同一个Bucket里吗?
可以,对象存储的Bucket支持存储任意类型的文件,你可以按目录区分不同类型的资源,比如/vod/存视频、/img/存图片,互不影响。
八、总结
整体操作流程可以归纳为四个核心步骤:先整理好HLS切片的完整目录结构并本地验证可用性,再提前创建对象存储Bucket并配置好权限、CORS等基础规则,选择合适的上传方式按原有相对路径批量上传所有文件,最后通过索引地址验证播放效果即可。
建议新手优先选择操作友好、兼容S3协议的对象存储服务,比如七彩云对象存储,不需要复杂的配置就能快速完成HLS切片的存储和分发,上传前注意检查文件命名和目录结构,避免因路径问题导致播放失败,若面向大量用户分发建议搭配CDN加速,进一步提升播放体验。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网