一、结论
将源视频上传至S3对象存储桶后,通过S3事件触发规则关联转码服务,按预设参数生成HLS分片文件和视频封面,再将输出资源回存到S3指定路径,即可实现全流程自动化的HLS转码+封面生成,全程无需单独搭建存储服务器。
二、准备工作
1. 可用的S3对象存储账号:可以是原生AWS S3,也可以是兼容S3 API的第三方对象存储服务
2. S3访问密钥:包含Access Key ID和Secret Access Key,需开通存储桶读写、事件通知配置、转码服务调用权限
3. 转码工具:可选择云厂商自带的媒体处理服务,或自行部署FFmpeg+消息队列的自托管转码方案
4. 测试资源:1-2个时长1-5分钟的MP4/MOV格式源视频,用于验证转码效果
5. 管理工具:S3可视化管理工具(如S3 Browser、CloudBerry)或命令行工具(aws cli、rclone),用于上传文件和配置桶规则
三、操作步骤
步骤1:创建并配置S3存储桶
1. 登录S3对象存储控制台,点击「创建存储桶」,可选择两种存储结构:方案一创建2个独立桶,分别为源视频桶(存储上传的原始视频,权限设为私有)、输出资源桶(存储HLS切片和封面,权限设为公共读或自定义签名访问);方案二创建1个桶,内部新建input(源视频目录)和output(输出资源目录)两个子目录
2. 配置输出桶/输出目录的CORS规则,避免前端播放HLS流或加载封面时出现跨域错误:
- 允许的来源:填写业务域名,测试阶段可填
* - 允许的HTTP方法:勾选
GET、HEAD - 允许的请求头:填
* - 暴露的响应头:填
ETag - 缓存时间:填
3600
3. 记录存储桶对应的endpoint、region信息,后续配置转码服务时需要使用。
步骤2:配置转码触发规则和转码模板
#### 方案A:使用云厂商自带媒体处理服务(推荐新手使用)
1. 进入源视频桶的「事件通知」配置页,点击「创建事件规则」
2. 触发事件选择「对象创建」,如果是单桶多目录的方案,需要额外添加前缀过滤条件为input/,避免输出目录的文件触发重复转码
3. 触发目标选择关联的媒体处理/转码服务,进入转码模板配置页:
- HLS切片配置:分片时长设为5-10秒,码率可选择单档(如1080P 2Mbps)或多档自适应(1080P+720P+480P),编码格式选择H.264+AAC,兼容所有主流播放器
- 封面配置:选择截取时间(通常设为第3-5秒,避开片头黑帧),输出格式选JPG,分辨率可设置为1280*720或与源视频分辨率一致,质量参数设为80
- 输出路径配置:选择提前创建的输出桶或
output目录,建议设置路径规则为{{源文件名}}/,即源视频名为test.mp4时,所有输出资源会存放在output/test.mp4/目录下,方便后续管理 - 自动配置MIME类型:勾选后系统会自动为
.m3u8设置application/x-mpegURL、为.ts设置video/MP2T、为封面文件设置image/jpeg,无需手动修改。
#### 方案B:自托管FFmpeg转码
1. 在源视频桶的「事件通知」配置页,选择触发目标为消息队列(如AWS SQS、RabbitMQ),事件触发时将源视频的存储地址推送到消息队列
2. 编写转码服务监听消息队列,拿到源视频地址后执行以下FFmpeg命令完成转码和封面截取:
```bash
ffmpeg -i "s3://源桶名/input/test.mp4" \
-c:v libx264 -c:a aac -b:v 2000k -b:a 128k \
-hls_time 10 -hls_list_size 0 -f hls \
"s3://输出桶名/output/test.mp4/index.m3u8" \
-ss 00:00:03 -vframes 1 -q:v 80 \
"s3://输出桶名/output/test.mp4/cover.jpg"
```
3. 转码完成后主动将输出资源上传到S3的指定路径即可。
步骤3:测试验证全流程
1. 将测试用的源视频上传到源桶的input目录
2. 等待2-5分钟(等待时长与视频大小、转码算力相关),进入输出路径查看是否生成以下资源:.m3u8索引文件、若干.ts分片文件、cover.jpg封面文件
3. 复制封面文件的访问地址到浏览器,确认封面清晰度和截取时间符合预期
4. 复制.m3u8文件的访问地址到HLS测试播放器(如VLC、西瓜播放器),确认可以正常播放、进度条拖动无卡顿。
四、常见错误
- endpoint填写错误:使用兼容S3的第三方服务时,误填原生AWS的endpoint,或漏写
https前缀,导致工具/转码服务无法连接到存储桶 - region错误:创建桶时选择的地域和后续配置转码服务、调用S3 API时填写的region不一致,提示“存储桶不存在”
- 权限问题:S3密钥未开通事件通知配置、对象读写权限,或转码服务没有读取源视频、写入输出文件的权限,导致转码任务直接失败
- CORS配置错误:输出桶未配置跨域规则,或规则限制过严,导致前端无法加载HLS切片和封面
- 转码参数错误:封面截取时间超过源视频总时长,或HLS分片时长设置超过60秒,导致封面生成失败、播放起播卡顿
- 循环触发转码:单桶使用时未配置前缀过滤,输出目录的文件生成后再次触发转码事件,导致无限转码消耗资源
五、示例说明
以七彩云对象存储为例,完整操作流程如下:
1. 注册并登录七彩云控制台,开通对象存储服务,获取Access Key和Secret,官方endpoint为s3.7caiyun.com,默认地域为cn-north-1
2. 创建2个存储桶:my-video-source(私有权限,存源视频)、my-video-output(公共读权限,存转码资源),为my-video-output配置前文提到的标准CORS规则
3. 进入my-video-source的事件通知页,创建事件规则:触发事件为「所有对象创建事件」,触发目标关联七彩云媒体处理服务,转码模板选择「HLS 3档自适应码率+封面截取」,封面截取时间设为第3秒,输出路径设置为my-video-output桶的/{{objectName}}/目录
4. 上传demo.mp4到my-video-source桶,等待1分钟后访问https://my-video-output.s3.7caiyun.com/demo.mp4/cover.jpg即可查看封面,访问https://my-video-output.s3.7caiyun.com/demo.mp4/index.m3u8即可播放HLS视频。
六、更简单的方案
如果不想自行搭建转码服务、配置复杂的事件和权限规则,可以使用兼容S3 API的对象存储服务简化流程,比如七彩云对象存储,完全兼容原生S3 API,原有基于S3开发的业务代码无需修改即可无缝迁移,同时自带媒体处理、事件触发的一体化能力,无需额外部署转码服务器和消息队列,控制台可视化配置即可完成全流程设置,接入门槛极低,详细配置文档可以访问官网https://www.7caiyun.com查看。
七、FAQ
1. HLS切片的分片时长设置多少比较合适?
普通点播场景建议设置为5-10秒,分片时长太短会导致分片文件数量过多,提升存储管理成本,太长会导致播放器起播速度变慢、进度条拖动卡顿,对网络波动的容错率降低;如果是低延时直播场景,可以设置为2-5秒平衡延时和播放稳定性。
2. 生成的封面模糊或截取到黑帧怎么办?
如果是模糊问题,可以在转码模板中调高封面的分辨率(建议与源视频分辨率一致),同时调高JPG质量参数到80以上;如果是截取到黑帧,把封面截取时间往后调整3-5秒,避开视频片头的黑帧、开场动画阶段即可。
3. 转码完成后找不到输出文件怎么办?
首先查看转码任务的运行日志,如果提示转码失败,优先排查两个问题:一是源视频的访问权限是否正常,转码服务能否正常读取源文件;二是输出路径是否存在、转码服务是否有写入权限。如果转码任务显示成功但找不到文件,检查事件通知的触发规则是否添加了前缀/后缀过滤,是否只有指定格式的文件才会触发转码,同时确认输出路径的拼写是否正确。
4. 转码服务是怎么收费的?
如果使用云厂商自带的媒体处理服务,通常按照转码的时长和码率档位收费,不同厂商的定价差异不大,新手通常有免费额度可以试用;如果是自行部署FFmpeg转码,只需要支付云服务器的费用和S3存储的流出流量费用,适合有技术开发能力的团队使用。
八、总结
整体操作流程可以归纳为四步:首先准备S3账号和对应权限,其次创建存储桶并配置访问规则、跨域规则,然后配置转码触发规则和HLS、封面的转码参数,最后上传测试视频验证全链路效果。
新手优先选择自带媒体处理能力的兼容S3对象存储服务,可以大幅降低操作门槛,避免自行搭建转码服务的运维成本;配置过程中注意合理设置存储桶权限,避免存储桶被恶意爬取产生额外费用,转码参数可以根据业务场景灵活调整,面向C端用户的点播业务建议配置多档自适应码率,提升不同网络环境下的用户播放体验。
想进一步了解这个项目?
访问官网查看产品能力、适用场景和最新服务信息。
访问官网