开始输入,可搜索发票、服务、域名、工单,以及 更多...
搭建视频点播(VOD)或短视频平台后端需要四样东西:存放原片和转码文件的存储型独立服务器、输出 HLS 多码率阶梯的 ffmpeg 转码流水线、MinIO 这类兼容 S3 的对象存储,以及承担大部分带宽的 CDN。IMIDC 在香港(CN2 GIA 直连大陆)、东京、新加坡、洛杉矶等亚太节点提供这些基础设施:香港独立服务器每月 $139 起,洛杉矶独立服务器每月 $499 起,配套 10Gbps 上行、DDoS 防护和 IMIDC CDN。
所有视频平台都遵循同一条流水线:上传、保存原片、转码、保存各档码率、经 CDN 分发。
master.m3u8,CDN 缺失的切片再回源到存储服务器。元数据(标题、作者、播放量、审核状态)放在 API 服务器的常规数据库里;视频文件本身放在存储服务器上。
每个视频一次编码出多档分辨率,并对齐关键帧,播放器才能平滑切换清晰度。
mkdir -p out/v0 out/v1 out/v2 out/v3
ffmpeg -i input.mp4 \
-filter_complex "[0:v]split=4[a][b][c][d];[a]scale=-2:1080[v0];[b]scale=-2:720[v1];[c]scale=-2:480[v2];[d]scale=-2:360[v3]" \
-map "[v0]" -c:v:0 libx264 -b:v:0 5000k -maxrate:v:0 5350k -bufsize:v:0 7500k \
-map "[v1]" -c:v:1 libx264 -b:v:1 2800k -maxrate:v:1 3000k -bufsize:v:1 4200k \
-map "[v2]" -c:v:2 libx264 -b:v:2 1400k -maxrate:v:2 1500k -bufsize:v:2 2100k \
-map "[v3]" -c:v:3 libx264 -b:v:3 800k -maxrate:v:3 856k -bufsize:v:3 1200k \
-map a:0 -map a:0 -map a:0 -map a:0 -c:a aac -b:a 128k -ac 2 \
-preset medium -profile:v high -pix_fmt yuv420p \
-force_key_frames "expr:gte(t,n_forced*2)" -sc_threshold 0 \
-f hls -hls_time 4 -hls_playlist_type vod -hls_flags independent_segments \
-hls_segment_filename "out/v%v/seg_%04d.ts" \
-master_pl_name master.m3u8 \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 v:3,a:3" \
out/v%v/index.m3u8
| 档位 | 分辨率(16:9) | 视频码率 | 音频 | 典型观众 |
|---|---|---|---|---|
| 1080p | 1920x1080 | 5,000 kbps | 128 kbps AAC | 电脑、电视、Wi-Fi |
| 720p | 1280x720 | 2,800 kbps | 128 kbps AAC | 4G/5G 信号良好的手机 |
| 480p | 854x480 | 1,400 kbps | 128 kbps AAC | 拥塞的移动网络 |
| 360p | 640x360 | 800 kbps | 128 kbps AAC | 弱信号、省流量模式 |
-force_key_frames "expr:gte(t,n_forced*2)" 不论帧率都每 2 秒插入一个关键帧,-sc_threshold 0 保证各档位关键帧对齐。短视频 App 的体验取决于首帧时间,因此要用小切片、精简阶梯和预加载预览。
# vertical short video: 3-step ladder, 2 s segments for a fast first frame
ffmpeg -i clip.mp4 \
-filter_complex "[0:v]split=3[a][b][c];[a]scale=1080:-2[v0];[b]scale=720:-2[v1];[c]scale=540:-2[v2]" \
-map "[v0]" -c:v:0 libx264 -b:v:0 3500k -maxrate:v:0 3750k -bufsize:v:0 5000k \
-map "[v1]" -c:v:1 libx264 -b:v:1 2000k -maxrate:v:1 2150k -bufsize:v:1 3000k \
-map "[v2]" -c:v:2 libx264 -b:v:2 1000k -maxrate:v:2 1070k -bufsize:v:2 1500k \
-map a:0 -map a:0 -map a:0 -c:a aac -b:a 96k \
-preset medium -force_key_frames "expr:gte(t,n_forced*2)" -sc_threshold 0 \
-f hls -hls_time 2 -hls_playlist_type vod \
-hls_segment_filename "short/v%v/seg_%03d.ts" -master_pl_name master.m3u8 \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" short/v%v/index.m3u8
# cover image and a small progressive MP4 preview for feeds
ffmpeg -ss 1 -i clip.mp4 -frames:v 1 -vf scale=540:-2 short/cover.jpg
ffmpeg -i clip.mp4 -t 6 -vf scale=360:-2 -c:v libx264 -b:v 400k -an -movflags +faststart short/preview.mp4
把转码文件存放在独立服务器上的兼容 S3 对象存储里,并按观看频率分层。
# single-node MinIO on a storage dedicated server (use distributed mode across 4+ servers for HA)
docker run -d --name minio --restart unless-stopped \
-p 9000:9000 -p 9001:9001 \
-v /data/minio:/data \
-e MINIO_ROOT_USER=vodadmin \
-e MINIO_ROOT_PASSWORD=replace-with-a-long-random-secret \
minio/minio server /data --console-address ":9001"
# buckets: raw uploads (private) and hls output (public read via CDN)
mc alias set vod http://127.0.0.1:9000 vodadmin replace-with-a-long-random-secret
mc mb vod/raw
mc mb vod/hls
mc anonymous set download vod/hls
mc ilm rule add vod/raw --expire-days 180 # drop raw uploads after 180 days
mc mirror --overwrite out/ vod/hls/videos/abc123/
MinIO 采用 AGPLv3 许可,其社区版的分发方式有过调整,投产前请确认当前版本和许可条款;SeaweedFS、Garage、Ceph RGW 也是兼容 S3 的可选方案。示例中的 raw 桶只是上传暂存区;请把原片或高质量母版文件另存到冷存储,便于日后重新转码。
| 层级 | 存放内容 | 硬件 | 访问特征 |
|---|---|---|---|
| 热数据 | 新视频和热门视频的转码文件 | NVMe/SSD 存储服务器 | CDN 持续回源 |
| 温数据 | 长尾内容的转码文件 | 大容量 HDD RAID 或纠删码独立服务器 | 偶尔回源、CDN 未命中 |
| 冷数据 | 原片和母版文件 | 高容量 HDD 服务器或托管的存储机箱 | 仅在重新转码时读取 |
粗略估算:上面四档阶梯合计约 10.5 Mbps,即每分钟视频约 79 MB。1,000 小时内容的转码文件约 4.7 TB,另加原片。
视频平台最大的持续成本是带宽而不是存储,选服务器前先算清楚。
| 日活观众 | 人均观看时长 | 平均分发码率 | 每月分发流量 |
|---|---|---|---|
| 1,000 | 20 分钟 | 1.5 Mbps | 约 6.75 TB |
| 10,000 | 20 分钟 | 1.5 Mbps | 约 67.5 TB |
| 50,000(短视频) | 30 分钟 | 1.2 Mbps | 约 405 TB |
| 100,000 | 20 分钟 | 1.5 Mbps | 约 675 TB |
Cache-Control,用带版本号的路径代替刷新缓存。源站放在观众所在地、且到观众线路最好的地方。
| 机房 | 主要观众 | 线路与 IP 说明 |
|---|---|---|
| 香港 | 中国大陆、香港、华语用户 | 中国电信 CN2 GIA(AS4809);托管无需 ICP 备案 |
| 日本东京 | 日本、韩国 | 日本原生 IP;VPS 可选 CN2 中国优化线路 |
| 新加坡 | 东南亚、印度、大洋洲 | 通过销售按需配置 |
| 美国洛杉矶 | 美洲,以及经优质线路访问的大陆用户 | 联通 9929/4837 与 CN2 线路 |
| 台北 / 曼谷 / 吉隆坡 | 单一市场平台 | 本地原生 IP |
很多平台只在 CDN 后面放一个主源站(通常在香港或东京),等到远端区域的回源变慢时再加第二个源站。
视频平台要对用户上传的内容负责,合规机制应从第一天就写进流水线。
先用一个源站加 CDN 起步,视频库增长后再把转码和存储拆开。
至少需要 API 服务器、运行 ffmpeg 的转码服务器、部署在存储型独立服务器上的 MinIO 等兼容 S3 存储,以及 CDN。IMIDC 在香港、东京、洛杉矶等亚太节点提供独立服务器,并有 IMIDC CDN 支撑这套架构。
大量观众在中国大陆就选香港,IMIDC 香港服务器走中国电信 CN2 GIA,且托管无需 ICP 备案。东南亚选新加坡,日韩选东京;IMIDC 新加坡服务器通过销售按需配置。
观众数 × 观看分钟数 × 平均码率即可估算:日活 1 万、人均 20 分钟、1.5 Mbps,每月约 67.5 TB。大部分流量应由 CDN 承担,存储源站只处理缓存未命中。
MinIO 是广泛使用的兼容 S3 存储,在独立服务器上存放 HLS 切片和原片效果很好。投产前请先确认其当前许可和版本;SeaweedFS、Garage、Ceph RGW 也可作为替代。
不一定。在高核心独立服务器上用 ffmpeg 做 CPU 编码,单位码率画质最好,扩容也简单。上传量很大时 GPU 可以提速,可向 IMIDC 销售咨询 GPU 或高核心配置。
准备搭建自己的视频平台?了解香港独立服务器和 IMIDC CDN,或提交工单,由 IMIDC 工程师协助规划存储、转码和分发方案。