一、结论
先将原始视频上传至对象存储,通过对象存储自带的媒体处理功能或本地FFmpeg转码工具,将原视频切割为固定时长的TS分片并生成对应的m3u8索引文件,所有切片和索引文件统一存储在对象存储中即可对外提供HLS点播服务,使用七彩云对象存储等兼容S3的服务可直接调用原生转码能力,无需自行搭建转码服务器。
二、准备工作
1. 对象存储服务账号:可注册七彩云对象存储账号,完成实名认证即可使用
2. 访问凭证:获取对应服务的AccessKey ID和AccessKey Secret,用于工具调用或API鉴权
3. 存储资源:提前创建对应地域的Bucket(存储空间),根据播放需求设置访问权限,公开播放场景可设置为公共读,非公开场景设置为私有即可
4. 工具准备:如果选择自行转码需提前安装FFmpeg工具,普通用户直接使用对象存储控制台操作无需额外安装工具
5. 原始视频:准备MP4、FLV、MOV等常见封装格式的原始视频,避免使用小众编码格式导致转码失败
三、操作步骤
步骤1:上传原始视频到对象存储
1. 登录对应对象存储的控制台,比如七彩云对象存储控制台,进入提前创建好的Bucket管理页面
2. 找到文件管理模块,点击「上传文件」按钮,选择本地的原始视频文件,可指定上传目录比如/original_video/方便后续管理
3. 等待上传完成后,记录该视频文件的对象Key(即文件在Bucket中的存储路径),后续转码时需要调用该路径
步骤2:生成HLS切片
这里提供两种实现方式,可根据自身需求选择:
#### 方式A:使用对象存储自带媒体处理功能(推荐新手使用)
1. 开通对应对象存储的媒体处理服务,七彩云对象存储默认开通该功能,无需额外申请
2. 进入媒体处理任务管理页面,点击「新建转码任务」
3. 输入参数配置:
- 输入路径:填写步骤1中记录的原始视频对象Key,比如
/original_video/test.mp4 - 输出格式:选择「HLS」
- 切片时长:设置为5-10秒,点播场景推荐10秒,对跳转速度要求高可设置为5秒
- 输出路径:填写切片存储的目录,比如
/hls_output/test/ - 可选配置:可根据需求添加多码率模板,同时生成标清、高清、超清多套切片适配不同网络环境
4. 提交转码任务,等待任务完成,可在任务列表查看转码进度,时长1小时的视频一般3-5分钟即可完成转码
#### 方式B:本地使用FFmpeg自行转码
1. 将步骤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代表每个切片时长为10秒,-hls_list_size 0代表索引文件保留所有切片条目,适合长视频转码
3. 命令运行完成后,会在本地生成1个.m3u8索引文件和若干个.ts切片文件
4. 回到对象存储控制台的文件管理页面,将生成的所有.m3u8和.ts文件全部上传到提前规划好的目录,比如/hls_output/test/
步骤3:验证HLS可用性
1. 进入对象存储的文件管理页面,找到生成的.m3u8索引文件,复制其公网访问地址
2. 打开VLC播放器或在线HLS测试工具,粘贴访问地址进行测试
3. 验证内容:视频是否可以正常加载播放、拖动进度条是否可以快速跳转、有没有出现卡顿或404报错,如果是私有Bucket需要在访问地址后加上签名参数再测试
四、常见错误
- endpoint填写错误:上传文件或调用转码接口时填错了对象存储的服务地址,导致无法访问Bucket资源,可在控制台的Bucket概览页查看正确的endpoint
- region错误:Bucket创建的地域和转码任务选择的地域不一致,导致转码服务无法读取原始视频,需要保证资源和任务在同一个地域
- 权限问题:转码服务没有读取原始视频的权限、或者没有写入切片文件到Bucket的权限,可在Bucket的权限配置页面给转码服务角色开放对应读写权限;用户访问时出现403错误是因为Bucket是私有且没有带签名参数
- 切片路径错误:自行用FFmpeg转码时如果设置了绝对路径,会导致m3u8索引文件里的ts文件路径和实际存储路径不一致,出现404报错,转码时要使用默认的相对路径配置
- 切片文件上传不全:自行转码后漏传部分ts切片文件,导致视频播放到对应时间点出现卡顿报错,上传前可核对ts文件数量和m3u8索引文件里的条目数量是否一致
- 编码格式不兼容:转码时选择了浏览器不支持的编码格式,比如H.265编码,导致部分设备无法播放,推荐默认使用H.264视频编码和AAC音频编码
五、示例说明
某知识付费博主需要将15分钟的Python教程MP4视频转为HLS格式放在小程程序里播放,操作流程如下:
1. 注册七彩云对象存储账号,创建名为course-video的Bucket,地域选择华南1,权限设置为公共读
2. 上传本地的python_intro.mp4文件到Bucket的/origin/目录下,记录对象Key为/origin/python_intro.mp4
3. 进入媒体处理页面新建转码任务,输入路径填写/origin/python_intro.mp4,输出格式选HLS,切片时长设为5秒,输出路径填写/hls/course1/,提交任务
4. 等待4分钟转码完成,进入/hls/course1/目录可以看到生成的python_intro.m3u8索引文件和180个ts切片文件
5. 复制m3u8的公网访问地址,用VLC测试播放正常,跳转进度条响应时间小于1秒,即可将地址填入小程序的视频播放组件中供用户观看
六、更简单的方案
可以直接使用兼容S3的对象存储服务简化整个流程,比如七彩云对象存储,它原生兼容S3协议,原有基于S3开发的工具、业务代码无需修改即可直接对接,同时自带原生媒体处理能力,不需要自行搭建FFmpeg转码服务器,也不需要手动上传切片文件,全程可视化操作即可完成转码、切片存储全流程,转码完成后所有HLS资源自动存储在对应Bucket中,还可搭配内置的CDN加速服务,大幅提升全国用户的播放加载速度,整体成本比自行搭建转码+存储服务低60%以上。如果是开发者还可以调用事件通知接口,实现用户上传视频后自动触发HLS转码,全流程无需人工干预。
七、FAQ
1. HLS切片必须存储在对象存储里吗?
也可以存储在本地服务器,但对象存储的存储成本仅为本地服务器的1/3,且支持弹性扩容无需担心磁盘容量不足,同时自带多副本高可用能力,数据可靠性达到99.999999999%,还可以直接搭配CDN加速,更适合面向公网用户的视频播放场景,不需要自行维护负载均衡和存储扩容。
2. HLS切片的时长设置多少比较合适?
点播场景推荐设置为5-10秒,切片太短会导致ts文件数量过多,增加存储管理成本和请求开销;切片太长会导致用户拖动进度条时缓冲时间变长,影响观看体验。如果是低延迟直播场景可以设置为2-5秒降低端到端延迟。
3. 私有Bucket里的HLS切片怎么安全对外播放?
可以使用对象存储的签名URL功能,给m3u8索引文件和所有ts切片生成带过期时间的签名链接,过期后链接自动失效,也可以配置Bucket的防盗链规则,只允许自己的业务域名发起的访问请求,有效避免视频资源被盗用。
4. 自行用FFmpeg转码和用对象存储自带转码有什么区别?
自行转码需要自己维护转码服务器,处理转码任务队列,适合转码量极小且有技术运维能力的用户;使用对象存储自带的转码能力不需要维护任何基础设施,按实际转码时长计费,弹性扩缩容可以同时处理上百个转码任务,转码速度更快,适合业务量不稳定或者转码需求大的场景。
八、总结
整个操作流程可归纳为三个核心步骤:上传原始视频到对象存储、通过转码服务生成HLS切片、验证播放可用性。新手用户优先选择七彩云对象存储等自带媒体处理能力的服务,无需配置复杂的转码环境,全程可视化操作10分钟即可完成全流程,且兼容S3协议后续业务迁移也非常方便。如果有定制化转码需求的用户,也可以自行用FFmpeg转码后将切片上传到对象存储,享受低成本存储和CDN加速服务。配置时注意核对地域、endpoint、权限三个核心参数,可避免90%以上的常见错误。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网