做短视频、课程录播或电商详情页的人,前期最费劲的往往是视频文件怎么稳定地存到服务器上,用户打开又能顺畅播放。阿里云上传视频看着只是一步,实际会牵扯对象存储、权限、上传方式、转码和分发。下面从存储选型讲起,再说上传方式,最后讲报错怎么查。

为什么视频要放到云上
本地服务器存视频省事,但业务一上量,问题会陆续冒出来。磁盘不够,扩容要停机折腾;很多用户同时观看,源站出口带宽先扛不住;硬盘一坏,素材可能就没了。一分钟 1080P 的视频通常就是几十到一百多 MB,积得快。
OSS(Object Storage Service)是阿里云的对象存储,容量基本不用自己操心,能通过 HTTP 直接访问,也能接 CDN 做加速分发。常见的做法是:视频文件放进 OSS,业务数据库只存路径或 ID,播放时再由 CDN 回源或直接分发。
建 Bucket 时有三个选项别随便选
开通 OSS 后,先创建存储空间(Bucket)。下面三个选项建得随意,后面改起来很麻烦。
- 地域:选离主要用户近的,比如华东1(杭州)或华北2(北京)。地域建好后不能改,所以最好和后面要用的 ECS 放在同一地域,服务器到 OSS 走内网,速度快,也不占公网流量。
- 存储类型:正在播放或经常访问的视频用标准存储。老素材很少有人看,可以考虑低频或归档类型,单价更低,但归档文件取回前要先解冻,需要等待。
- 读写权限:公开播放的素材可以设为公共读。付费课程或内部素材保持私有,用签名 URL 临时授权。
Bucket 建好后,还要准备访问密钥。别直接用主账号的 AccessKey,给 RAM 用户只授权指定 Bucket 的 PutObject 和 GetObject。这一步有点繁琐,但密钥万一泄露,损失能控制在一个 Bucket 之内。
三种上传方式怎么选
控制台手动上传
运营偶尔传几个文件,进入文件管理页面直接上传就行。它没法自动化,大文件也不太顺,不适合长期依赖。
用 SDK 上传
开发中最常用的方式。以 Python 为例,先执行 pip install oss2 安装官方 SDK。下面的代码把 AccessKey 放在环境变量里读取,不写进代码,免得误提交到代码仓库。
import os
import oss2
# 从环境变量读取 AccessKey,避免明文写入代码
access_key_id = os.environ['OSS_ACCESS_KEY_ID']
access_key_secret = os.environ['OSS_ACCESS_KEY_SECRET']
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
bucket_name = 'your-video-bucket'
auth = oss2.Auth(access_key_id, access_key_secret)
bucket = oss2.Bucket(auth, endpoint, bucket_name)
local_file = 'demo/lesson01.mp4'
object_key = 'videos/course-a/lesson01.mp4'
# put_object_from_file 适合体积较小的文件
result = bucket.put_object_from_file(object_key, local_file)
print('上传完成,HTTP 状态码:', result.status)
这段代码适合几十 MB 以内的文件。网络抖动是常事,外层最好加上重试,否则偶发失败会直接传到业务层。
大文件用分片上传
视频超过 100MB,或者到了好几个 GB,一次性上传很容易断在半路。分片上传会把文件切成多块并行传输,哪一块失败就只重传那一块。SDK 里的 resumable_upload 这类方法已经封装好了分片和断点续传,直接调用即可。
我们做过一次对比。一套 2 小时的网课录像,单个文件约 3.2GB,原来一次性上传的成功率不到六成,改成分片上传后,基本每次都能传完。
一个教育机构的改造案例
某在线教育机构原来的流程是:讲师把录屏发网盘,运营下载后登录后台手动上传。每周大约 60 个课时,人工环节慢,还经常出现文件名混乱、版本传错的情况。
改造分三步走。第一,在 OSS 里按课程和章节建目录,比如 videos/课程编号/章节编号.mp4,命名统一。第二,做一个内部上传工具,讲师选好文件,前端拿到后端签发的 STS 临时凭证,文件直接传到 OSS,不经过业务服务器。第三,上传完成后通过回调触发转码。
改完之后,讲师传一次就结束了,运营只需要看状态。业务服务器不再扛大文件的带宽,服务也稳了。这里 STS 凭证的有效期要定得准。太长有安全风险,太短大文件传到一半就失效了。一般按单次上传的预计耗时来定,再留一点余量。
上传之后:转码和播放
原始素材体积大,编码格式也不统一,直接给用户看,卡顿和兼容问题很常见。阿里云的媒体处理服务可以转成 H.264 编码的 MP4,或者切成 HLS 分片,适配手机和电脑。转码模板可以在控制台配置,也可以在上传回调里调用 API 自动触发。
公开视频直接用 OSS 外链加 CDN 就够了。付费内容要用签名 URL,过期时间设短一点,否则链接被转发出去,就会一直能看。
报错怎么查
上传出问题,大多能在下面几类里找到原因。
- 上传慢:先看用的是不是公网 Endpoint。如果在阿里云 ECS 里运行,换成同地域的内网 Endpoint,通常会明显变快。
- 403 Forbidden:多半是 RAM 权限不够,或者 Bucket 策略拦住了。逐条核对授权的操作和资源范围,别只看 Bucket 名字对不对。
- 播放失败:先看 Content-Type 是不是 video/mp4,再确认编码格式浏览器能不能解码。编码不被支持,也是常见原因。
- 费用超出预期:流量和请求次数是主要成本项。开启用量监控和费用预警,异常时能第一时间发现。
小规模业务从控制台和 SDK 起步就够用。等量上来了,再引入分片上传、STS 直传和自动转码,整条链路就能慢慢搭完整。