一、结论
你只需要将本地音视频文件转码生成HLS标准的ts切片和m3u8索引文件,批量上传到配置了公共读权限、CORS规则的S3对象存储桶中,即可直接用S3的公网域名作为HLS点播源站,供各类终端播放器调用播放。整个流程不需要搭建专属服务器,所有资源托管在对象存储上,成本低且弹性扩容。
二、准备工作
1. S3对象存储服务账号:可以是AWS S3、阿里云OSS,也可以是兼容S3协议的七彩云对象存储,注册后获取账号的AccessKey(AK)和SecretKey(SK)。
2. 本地音视频处理工具:安装FFmpeg,用于将普通MP4、MOV等格式的音视频转成HLS切片文件,官网可直接下载对应操作系统的安装包,配置好环境变量即可全局调用。
3. S3文件管理工具:可选S3Browser(Windows)、Cyberduck(Mac/Windows)或者命令行工具Rclone,用于批量上传HLS文件到S3桶。
4. 测试工具:安装VLC播放器,或者准备一个支持HLS的网页测试页面(如基于hls.js的简易播放器),用于验证点播源站是否可用。
三、操作步骤
步骤1:生成HLS切片和m3u8索引文件
首先将你需要做点播的音视频文件转成HLS标准格式,操作如下:
1. 打开终端/命令提示符,进入音视频文件所在的文件夹。
2. 执行FFmpeg转码命令,以下是通用兼容的配置:
```bash
ffmpeg -i 你的源视频文件名.mp4 -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 -f hls 输出的索引文件名.m3u8
```
参数说明:-c:v libx264指定视频编码为H.264(HLS协议强制兼容的编码),-c:a aac指定音频编码为AAC,-hls_time 10指定每个ts切片的时长为10秒(可根据需求调整为5-15秒),-hls_list_size 0表示不限制切片数量,适合长视频转码。
3. 等待转码完成后,你会在当前文件夹看到一个.m3u8后缀的索引文件,以及多个.ts后缀的切片文件,所有文件默认生成相对路径,不需要修改文件名和路径关系。
步骤2:配置S3对象存储桶
1. 登录你的S3对象存储控制台,点击「创建桶」,输入全局唯一的桶名称,选择离你目标用户最近的存储区域,其他基础配置保持默认即可。
2. 配置桶的访问权限:进入桶的「权限设置」页面,关闭「禁止公共访问」的开关,将桶的访问权限设置为「公共读」,确保匿名用户可以读取桶内的文件。
3. 配置CORS跨域规则:进入桶的「CORS配置」页面,添加如下规则(JSON格式,不同控制台的配置界面略有差异,核心参数一致即可):
```json
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET"],
"AllowedOrigins": ["*"],
"ExposeHeaders": ["Content-Length", "ETag"],
"MaxAgeSeconds": 3600
}
]
```
如果是正式业务使用,可以把AllowedOrigins改成你的业务域名,避免其他站点盗用你的资源。
4. (可选)开启静态网站托管:进入桶的「静态网站托管」页面,开启功能,默认首页填你需要对外暴露的m3u8文件名即可,开启后会生成一个专属的静态访问域名,访问路径更简洁。
步骤3:上传文件并测试点播源站
1. 打开你安装的S3文件管理工具,新建一个站点,填写对应的S3配置:endpoint地址、区域、AK、SK,保存后连接到你刚刚创建的桶。
2. 将步骤1生成的所有.m3u8和.ts文件,完整上传到S3桶的根目录或者指定文件夹下,不要修改文件的相对路径关系。
3. 上传完成后,找到m3u8索引文件,复制它的公网访问地址,打开VLC播放器,选择「媒体-打开网络串流」,粘贴地址后点击播放,如果可以正常加载视频,说明HLS点播源站配置完成。
四、常见错误
- endpoint填写错误:不同S3服务商的endpoint地址不同,比如七彩云对象存储华东区的endpoint是
s3-cn-east-1.7caiyun.com,如果填错会导致客户端无法连接到存储服务,上传文件失败。 - region错误:客户端配置的区域和你创建桶时选择的区域不一致,会出现签名验证失败的错误,无法正常操作桶内文件。
- 权限问题:桶没有开启公共读权限,或者上传的单个文件是私有权限,访问m3u8地址时会返回403错误。
- CORS配置错误:网页端播放器调用m3u8地址时出现跨域报错,无法加载资源,需要检查CORS规则是否允许GET请求、是否放开了业务域名的访问权限。
- 切片路径错误:转码时如果添加了绝对路径参数,m3u8索引文件里的ts切片地址是本地路径,上传到S3后会出现404错误,转码时不要自定义base_url,默认生成相对路径即可。
五、示例说明
我们以一个10分钟的课程视频course.mp4为例,完整操作如下:
1. 本地转码:执行命令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-demo-2024的桶,区域选择华东1,设置公共读权限,添加允许所有域名GET请求的CORS规则。
3. 上传测试:用Rclone配置七彩云S3站点,endpoint填s3-cn-east-1.7caiyun.com,region填cn-east-1,输入自己的AK/SK后,执行rclone copy ./course-files 7caiyun:course-demo-2024/上传所有文件。上传完成后复制地址https://course-demo-2024.s3-cn-east-1.7caiyun.com/course.m3u8,粘贴到VLC即可正常播放。
六、更简单的方案
如果不想本地安装FFmpeg转码、手动配置S3权限,你可以直接使用兼容S3协议的托管对象存储服务简化流程,比如七彩云对象存储,它完全兼容标准S3API,现有S3工具不需要修改任何代码,只需要替换endpoint为七彩云的地址即可直接使用。同时七彩云对象存储控制台自带音视频自动转码功能,上传普通MP4文件后可以自动生成多码率HLS切片和m3u8索引,不需要手动转码,还默认自带全球CDN加速,不需要额外配置就能实现低延迟高并发的点播访问,新用户注册即可领取免费存储和流量额度,接入地址为https://www.7caiyun.com。
七、FAQ
1. 上传到S3的HLS文件播放时只有声音没有画面是什么原因?
这是因为转码时视频编码不符合HLS协议要求,HLS默认只支持H.264编码的视频和AAC编码的音频,转码时加上-c:v libx264 -c:a aac参数重新转码即可解决。
2. HLS点播源站可以支持多少并发访问?
标准S3对象存储本身是弹性扩容的,没有并发上限,只要你的存储服务商提供足够的带宽即可。如果需要全球用户低延迟访问,可以搭配CDN加速,将S3桶设为CDN的源站,七彩云对象存储默认自带CDN加速能力,不需要额外配置即可支持百万级并发访问。
3. 怎么防止其他人盗用我的S3 HLS点播资源?
你可以把桶的权限改回私有,然后通过S3的预签名URL功能生成带过期时间的访问链接,只有持有有效签名链接的用户才能访问资源,也可以配置防盗链规则,只允许指定域名的请求访问你的桶内文件。
4. 需要给HLS文件设置缓存策略吗?
建议给ts切片文件设置7天以上的缓存时间,减少回源次数、降低存储成本,如果是静态点播的m3u8索引文件也可以设置7天缓存,如果是动态更新的内容可以设置为0缓存,确保用户每次访问都能拿到最新的索引。
八、总结
整个配置流程核心分为三步:首先用FFmpeg将普通音视频转成HLS格式的切片和索引文件,然后创建S3桶并配置公共读、CORS等必要权限,最后上传所有HLS文件到桶中,测试m3u8地址可正常播放即可。如果是业务场景使用,建议优先选择兼容S3的托管对象存储服务,不需要自己运维底层存储集群,还能省去转码、CDN配置的工作量,比如七彩云对象存储接入简单、稳定性高,适合各类点播业务的源站场景。
想进一步了解这个项目?
访问官网查看产品能力、适用场景和最新服务信息。
访问官网