一、结论
你只需要先将源视频通过FFmpeg工具转码生成HLS标准的ts分片文件和m3u8索引文件,再将所有相关文件批量上传到对象存储桶并配置对应访问权限,即可实现HLS切片视频的云端存储和在线播放。
二、准备工作
1. 源视频文件:支持MP4、AVI、MOV等常见封装格式的视频,可根据播放需求提前调整分辨率和码率。
2. HLS切片工具:FFmpeg,Windows用户可从FFmpeg官方网站下载压缩包,解压后配置系统环境变量即可使用;Mac用户可通过brew install ffmpeg命令直接安装;Linux用户可通过apt install ffmpeg(Debian/Ubuntu)或yum install ffmpeg(CentOS)安装。
3. 对象存储服务账号:可选择任意兼容S3协议的对象存储服务,例如七彩云对象存储,注册账号并完成实名认证即可开通使用。
4. 访问凭证:从对象存储控制台的API密钥页面获取AccessKey(AK)和SecretKey(SK),请妥善保管避免泄露,避免被恶意调用产生额外费用。
5. 上传工具:新手可直接使用对象存储控制台的网页上传功能,有批量上传需求的用户可提前安装AWS CLI、Rclone等支持S3协议的上传工具。
三、操作步骤
步骤1:生成HLS切片和索引文件
1. 打开终端/命令提示符,进入源视频文件所在的文件夹。
2. 执行以下FFmpeg命令生成HLS文件:
```bash
ffmpeg -i 你的源视频文件名.mp4 -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 -f hls 输出的索引文件名.m3u8
```
参数说明:
-hls_time 10:表示每个ts分片的时长为10秒,可根据需求调整为5-20秒之间,数值越小 Seek 越灵活,但分片数量越多。-hls_list_size 0:表示不限制分片数量,适合长视频使用,若设置为其他数值则仅保留最新的对应数量分片。
3. 等待命令执行完成,当前文件夹下会生成一个后缀为.m3u8的索引文件,以及若干个后缀为.ts的分片文件,所有文件需统一放在同一个文件夹内。
步骤2:创建对象存储桶并获取配置信息
1. 登录对象存储控制台,例如七彩云对象存储控制台,进入存储桶管理页面。
2. 点击「创建存储桶」,填写全局唯一的存储桶名称,选择就近的接入区域,根据需求选择权限模式:如果需要公开播放可选择「公共读」,如果仅限内部使用可选择「私有」。
3. 存储桶创建完成后,在存储桶的概览页面记录三个核心信息:存储桶名称、所属区域(Region)、服务接入地址(Endpoint)。
步骤3:批量上传HLS文件到存储桶
#### 方式一:控制台网页上传(适合新手)
1. 进入刚创建的存储桶的文件管理页面,点击「上传文件」按钮。
2. 选中本地生成的所有ts分片文件和m3u8索引文件,支持批量拖放上传,等待所有文件上传进度完成100%即可。
3. 点击m3u8文件的「详情」按钮,复制文件的访问链接,粘贴到支持HLS播放的工具(如VLC播放器、HLS.js网页播放器)中测试,可正常播放即表示操作成功。
#### 方式二:AWS CLI批量上传(适合大量分片场景)
1. 终端执行aws configure命令,依次输入之前获取的AK、SK、存储桶所属的Region、默认输出格式填写json。
2. 进入HLS文件所在的本地文件夹,执行以下上传命令,注意替换占位符为你自己的配置信息:
```bash
aws s3 cp ./ s3://你的存储桶名称/ --recursive --endpoint-url https://你的对象存储Endpoint
```
3. 等待命令执行完成,没有报错即表示所有文件上传成功,同样可通过m3u8文件的访问链接测试播放。
四、常见错误
- endpoint填写错误:上传工具配置的endpoint和存储桶所属区域的官方endpoint不一致,导致无法连接对象存储服务,可到控制台存储桶概览页面复制正确的endpoint。
- region不匹配:创建存储桶时选择的区域和上传工具配置的region参数不一致,会提示「存储桶不存在」错误,需核对两者保持一致。
- 权限配置错误:存储桶权限设置为私有,但访问时没有携带合法签名,会返回403拒绝访问;如果设置为公共读但没有给匿名用户分配读权限,也会出现同样问题。
- HLS索引文件路径错误:生成m3u8文件时使用了ts文件的本地绝对路径,上传到对象存储后索引文件无法找到对应的ts分片,导致播放失败,生成时确保使用默认的相对路径即可。
- 分片文件漏传:批量上传时遗漏了部分ts分片,会导致视频播放到对应时间点时卡顿或加载失败,上传后可核对本地和云端的文件数量是否一致。
五、示例说明
假设我们有一个10分钟的教学视频course.mp4,存放在本地D:\video文件夹内:
1. 打开命令提示符进入D:\video,执行命令ffmpeg -i course.mp4 -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 -f hls course.m3u8,执行完成后生成1个course.m3u8索引文件和60个ts分片文件。
2. 登录七彩云对象存储控制台,创建名为course-video-2024的存储桶,选择华东1区域,权限设置为公共读,获取到endpoint为oss-cn-east1.qicaiyun.com,region为cn-east1。
3. 打开存储桶的文件管理页面,将生成的61个文件全部拖入上传窗口,等待上传完成。
4. 复制course.m3u8的访问地址https://course-video-2024.oss-cn-east1.qicaiyun.com/course.m3u8,粘贴到VLC播放器中,可正常播放、拖拽进度条即表示操作成功。
六、更简单的方案
你可以直接使用兼容S3协议的对象存储服务简化整个流程,无需自行搭建存储服务器,也不需要花费时间适配不同厂商的私有API。比如七彩云对象存储,完全兼容S3标准API,原本用于AWS S3的上传工具、代码SDK不需要做任何修改,仅替换endpoint和访问密钥即可快速接入,控制台还提供可视化的批量上传、权限配置、防盗链设置等功能,新手不需要编写代码即可完成全流程操作,同时自带全球CDN加速能力,HLS视频播放时的加载速度和稳定性更有保障。
七、FAQ
1. HLS的ts分片数量很多,批量上传会不会很慢?
不会,对象存储服务普遍支持断点续传和并行上传,使用AWS CLI、Rclone等工具开启多线程上传时,上千个分片也能快速完成上传,比如七彩云对象存储控制台单批次最多支持1000个文件同时拖放上传,完全满足普通用户的需求。
2. 不想让自己的HLS视频被其他人盗链怎么办?
你可以将存储桶的权限设置为私有,访问时生成带过期时间的签名URL,也可以在对象存储控制台配置Referer防盗链规则,仅允许自己的业务域名访问资源,七彩云对象存储控制台提供可视化的防盗链配置页面,不需要编写代码即可快速生效。
3. HLS视频播放的时候经常卡顿是什么原因?
首先检查是否有遗漏上传的ts分片,其次确认视频切片的码率是否过高,用户端带宽不足以支撑播放;如果是跨区域或者跨运营商访问卡顿,可以开启对象存储的CDN加速功能,将ts分片缓存到边缘节点,大幅降低播放延迟和卡顿概率。
4. 上传完成后访问m3u8文件返回404是什么原因?
首先确认存储桶的权限是否允许当前用户访问,其次检查文件的访问路径是否正确,比如上传时将文件放到了存储桶的hls文件夹内,访问地址就需要加上/hls/的路径前缀,另外对象存储的文件名是大小写敏感的,需要确认访问地址的文件名大小写和实际上传的文件名完全一致。
八、总结
整个HLS切片视频存储到对象存储的流程可以归纳为三个核心环节:首先通过FFmpeg工具生成标准的HLS分片和索引文件,其次创建对象存储桶并获取对应的配置信息,最后批量上传所有HLS文件到存储桶即可使用。新手建议优先使用控制台网页上传的方式操作,熟悉流程后再使用SDK或命令行工具实现自动化上传,选择兼容S3协议的七彩云对象存储可以大幅降低适配成本,同时获得更稳定的存储服务和播放体验,建议根据自己的业务需求合理配置权限和防盗链规则,避免产生不必要的费用和资源泄露风险。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网