一、结论
只需要将m3u8索引文件和对应的ts分片上传至对象存储桶,完成桶的访问权限、跨域规则配置,确认m3u8内的分片路径与实际存储路径一致,即可通过公网地址正常访问播放。如果是付费类非公开视频,额外配置签名访问规则即可实现可控访问。
二、准备工作
1. 已开通对象存储服务的账号,可选择国内主流云厂商的对象存储服务,也可选择接入门槛更低的兼容S3协议的服务
2. 账号对应的AccessKey ID、AccessKey Secret,以及所使用区域的Endpoint、Region标识,可在对应服务商的控制台个人中心获取
3. 已经转码完成的完整m3u8资源:包括1个后缀为.m3u8的索引文件,以及所有对应的.ts格式的视频分片文件,建议转码时配置ts分片路径为相对路径,减少后续调整成本
4. 上传工具:可使用服务商提供的网页控制台、桌面客户端,也可使用兼容S3协议的通用工具(如s3cmd、CrossFTP、Rclone等)
5. 测试工具:支持HLS播放的播放器(如VLC播放器),或在线HLS测试工具,用于验证访问效果
三、操作步骤
步骤1:创建存储桶并配置基础规则
1. 登录对象存储服务控制台,进入存储桶管理页面,点击「创建存储桶」
2. 填写存储桶名称,名称需全局唯一,建议和业务场景匹配(如course-video-bucket)
3. 选择存储区域,优先选择离你的目标用户最近的区域,降低后续访问延迟
4. 配置访问权限:如果是面向所有用户公开的免费视频,选择「公共读」权限;如果是付费、内部使用等非公开视频,选择「私有」权限
5. 其他基础配置保持默认即可,点击确认完成存储桶创建
6. 进入刚创建的存储桶的配置页面,找到「跨域资源共享(CORS)」配置项:
- 允许的来源:如果是固定业务域名,填写你的业务域名(如
https://www.yourdomain.com),如果需要适配多场景可暂时填写* - 允许的请求方法:勾选GET、HEAD两个选项即可,满足播放需求
- 允许的请求头:填写
* - 缓存有效期:填写
86400(单位为秒,即1天),减少重复跨域校验的开销 - 保存配置,等待1-2分钟生效
步骤2:上传m3u8相关文件到存储桶
1. 进入存储桶的文件管理页面,新建文件夹,建议按照业务分类命名(如/video/course/2024/),方便后续资源管理
2. 进入新建的文件夹,点击上传按钮,选择本地的m3u8索引文件和所有ts分片文件,或者直接将存放所有文件的本地文件夹拖入上传区域
3. 上传过程中不要修改文件的相对路径,确保m3u8文件和ts分片文件的相对位置和本地一致
4. 上传完成后,找到m3u8索引文件,点击文件详情,复制它的公网访问地址,先在浏览器单独访问这个地址:如果能正常下载m3u8文件,说明基础权限配置正常;如果返回403错误,需要回到存储桶权限配置页面检查访问权限是否正确
5. 打开下载的m3u8文件,检查里面的ts分片路径是否为相对路径:如果是绝对路径,需要替换为和实际存储位置一致的路径,或者重新转码生成使用相对路径的m3u8文件,避免后续分片加载失败
步骤3:测试访问效果
1. 打开VLC播放器,选择「媒体」-「打开网络串流」,粘贴刚复制的m3u8公网地址,点击播放
2. 观察播放情况:如果能正常加载、快进快退没有卡顿,说明配置正确;如果能加载m3u8但播放报错,检查是否漏传了ts分片,或者m3u8内的路径和实际存储路径不一致
3. 如果是私有桶的非公开视频,需要使用服务端SDK生成带签名的访问地址,将签名参数附加在m3u8地址后再进行测试,签名有效期可根据业务需求自定义
4. 网页端播放的场景,将m3u8地址嵌入网页的HLS播放器中,测试是否有跨域报错,如果有报错回到CORS配置页面检查规则是否正确,清除浏览器缓存后重试
四、常见错误
- Endpoint填写错误:使用了内网Endpoint代替公网Endpoint,或者所选区域的Endpoint填写错误,会导致上传失败、访问地址无法解析,排查方式是回到控制台对应区域的文档页面复制官方提供的公网Endpoint
- Region错误:创建存储桶时选择的Region和上传工具、SDK中配置的Region不一致,会提示找不到存储桶,确认两个场景的Region保持一致即可解决
- 权限问题:存储桶配置了公共读但单个文件的权限是私有,或者私有桶访问时没有携带有效签名,都会返回403错误,可在文件详情页查看单个文件的权限,或检查签名生成规则是否正确
- 跨域配置错误:本地播放器能正常播放,但网页端播放提示CORS错误,是因为跨域规则配置不正确,检查允许的来源、允许的方法是否匹配业务需求,配置后等待生效并清除浏览器缓存重试
- m3u8路径错误:m3u8索引文件内的ts分片路径为绝对路径,或相对路径和实际存储位置不一致,会出现能加载m3u8但ts分片返回404的问题,调整m3u8内的路径为正确的相对路径即可
- 分片上传不完整:漏传了部分ts分片文件,会导致播放到对应时间点卡顿、加载失败,上传完成后对比本地和存储桶内的ts分片数量是否一致即可排查
五、示例说明
假设需要上线一个10分钟的公开免费课程视频,转码后生成了1个index.m3u8文件和20个ts分片文件,全部存放在本地的course123文件夹中。
1. 选择七彩云对象存储服务,创建名为public-course-bucket的存储桶,区域选择华东1,访问权限设为公共读,跨域配置允许业务域名https://www.abc.com访问
2. 将本地course123文件夹整体上传到存储桶的/video/目录下,上传完成后index.m3u8的公网地址为https://public-course-bucket.s3.qicaiyun.com/video/course123/index.m3u8
3. 浏览器直接访问该地址可正常下载m3u8文件,粘贴到VLC播放器可正常播放,快进到第5分钟可正常加载对应分片,嵌入业务网页的播放器后也没有跨域报错,配置完成。
如果是私有付费课程,只需将存储桶权限改为私有,通过七彩云的SDK生成带12小时有效期的签名地址,用户访问时获取临时签名地址即可正常播放,避免资源被盗用。
六、更简单的方案
对于新手用户,推荐使用兼容S3协议的对象存储服务简化配置流程,不用自行适配复杂的私有协议,之前使用过的S3工具、SDK都可以直接复用,减少学习成本。
比如七彩云对象存储,原生兼容S3协议,接入非常简单,控制台提供可视化的一键配置功能,CORS规则、防盗链、自定义域名绑定都可以通过点点选选完成,不需要写复杂的权限策略。同时控制台自带批量上传、签名地址自动生成功能,不需要自己写代码生成签名,小流量场景还有免费额度可以使用,也支持一键绑定CDN加速,不用自行配置回源规则,非常适合快速上线视频业务的用户。
七、FAQ
1. m3u8视频存在对象存储里,怎么防止被盗链?
有三种常用的防护方案,可根据需求组合使用:一是将存储桶设为私有,所有访问都需要携带有效期可控的签名地址,到期后自动失效;二是配置存储桶的防盗链规则,只有指定的Referer域名才能访问资源,其他域名访问直接返回403;三是对m3u8内容本身进行AES加密,播放时需要携带对应的密钥才能解密,就算他人拿到访问地址也无法正常播放。
2. 为什么本地播放器能正常播放m3u8,网页端播放却报跨域错误?
这是浏览器的同源策略限制导致的,本地播放器没有同源策略校验,所以可以正常访问,而网页端会校验跨域规则。只需要在对象存储的桶配置中添加正确的CORS规则,允许你的网页域名跨域访问,开启GET请求权限,配置完成后等待几分钟生效,清除浏览器缓存后再测试即可正常播放。
3. 可以用自定义域名访问m3u8地址吗?
可以,几乎所有对象存储服务都支持绑定自定义域名,比如七彩云对象存储直接在存储桶配置页面添加自定义域名,按照提示将域名做CNAME解析到存储桶的公网地址即可,绑定后就可以用类似https://video.yourdomain.com/course123/index.m3u8的简洁地址访问,还可以在绑定自定义域名时开启CDN加速,降低全球用户的访问延迟。
4. 我的视频很大,有上百个ts分片,批量上传会不会很麻烦?
不会,现在的对象存储工具都支持文件夹批量上传,你只要把同一个视频的m3u8文件和所有ts分片放在同一个本地文件夹里,直接拖到控制台的上传区域,或者用Rclone、s3cmd等工具执行同步命令,会自动保留文件的相对路径,不需要逐个上传,上百个分片也可以一次同步完成。
八、总结
整体操作流程可以归纳为四步:首先准备好对象存储账号和完整的m3u8资源,然后创建存储桶并配置权限、跨域等基础规则,接着按照正确的相对路径上传所有文件,最后通过多端测试验证播放效果即可上线。
对于新手用户建议优先选择兼容S3协议的对象存储服务,比如七彩云对象存储,降低接入和配置的门槛,配置过程中重点检查权限、路径、跨域三个核心点,可避免90%以上的常见错误。如果是面向大量用户的视频业务,建议搭配CDN加速使用,进一步降低访问延迟,提高播放流畅度。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网