本文约 3,560 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:一个 2GB 的视频,被看了 500 次
有个做教程站的博主,把课程视频直接放在自己的服务器上,文章里用 <video> 标签播放。第一个月相安无事,第二个月收到账单:视频产生的下行流量 1.2TB,费用比服务器贵了五倍。更糟的是,海外用户反馈播放卡顿——他的服务器在国内,跨洋访问延迟高,而 <video> 标签没有自适应码率,网络一波动就转圈。
视频站的成本结构比图文站陡峭得多。一段 1080P、10 分钟的视频大约 100–200MB,被观看 1000 次就是 100–200GB 流量。而且视频对网络质量要求高,卡顿直接影响完播率。因此”放哪”这个决策,几乎是视频站最重要的一次架构选择,且后期迁移代价很大。
原理分析:自托管与嵌入的四维对比
存储与流量:自托管需要自己承担全部流量费,且没有弹性;第三方平台(B 站、腾讯视频、YouTube、Vimeo)承担流量,但会插播广告或限制清晰度。
播放器体验:自托管用原生 <video> 或 Video.js / Plyr,控制力强但无自适应码率(除非自己做 HLS 切片);第三方播放器自带码率自适应、清晰度切换、倍速,体验通常更好。
可控性与审核:自托管完全可控,无审核风险;第三方受平台规则约束,视频可能被下架、限流,或因为版权投诉被删除。
版权与合规:自托管意味着你自己承担版权审核责任;第三方平台有版权库比对机制,但也有连带责任风险。
| 维度 | 自托管 | 第三方嵌入 |
|---|---|---|
| 流量成本 | 高,全部自付 | 低,平台承担 |
| 播放器 | 需自建,无自适应 | 现成,体验好 |
| 可控性 | 完全可控 | 受平台规则约束 |
| 版权风险 | 自行承担 | 平台+自身共担 |
| 适合 | 付费课程、内部培训 | 引流内容、公开分享 |
一个常见的折中方案:公开引流内容用第三方嵌入,付费内容用自托管 + 签名链接 + 对象存储,兼顾成本与可控性。
保姆级实操
步骤 1:自托管时先做好视频转码。 用 FFmpeg 压缩并生成多码率,避免直接上传原始文件。
# 转为 H.264/AAC,控制码率,適合网络播放
ffmpeg -i input.mov -c:v libx264 -preset slow -crf 23 \
-vf "scale=-2:1080" -c:a aac -b:a 128k -movflags +faststart \
output-1080p.mp4
# 生成 HLS 切片,实现自适应码率
ffmpeg -i output-1080p.mp4 -c:v libx264 -c:a aac \
-b:v:0 2500k -s 1920x1080 \
-b:v:1 1200k -s 1280x720 \
-b:v:2 600k -s 854x480 \
-f hls -hls_time 6 -hls_playlist_type vod -master_pl_name master.m3u8 \
output.m3u8
步骤 2:配置 nginx 支持拖动进度。 原生 mp4 需要 ngx_http_mp4_module 支持 Range 请求。
location ~ \.mp4$ {
mp4;
mp4_buffer_size 4m;
mp4_max_buffer_size 10m;
gzip off; # 视频无需 gzip,浪费 CPU
sendfile on;
tcp_nopush on;
limit_rate 3m; # 限速略高于视频码率即可
limit_rate_after 10m;
valid_referers none blocked server_names *.mimangfei.com;
if ($invalid_referer) { return 403; }
expires 30d;
add_header Accept-Ranges bytes;
}
步骤 3:用 WordPress 原生方式嵌入第三方视频。 默认支持 oEmbed,直接把 URL 单独放一行即可。
<?php
// 输出 oEmbed 结果(自带缓存,缓存存在 postmeta 里)
echo wp_oembed_get( 'https://www.bilibili.com/video/BV1xx411c7mD' );
?>
步骤 4:给自定义视频源注册 oEmbed 提供者。 若使用自建或第三方视频平台,可用 wp_oembed_add_provider()。
add_action( 'init', function () {
wp_oembed_add_provider(
'#https?://(www\.)?v\.example\.com/video/.*#i',
'https://v.example.com/oembed',
true
);
} );
步骤 5:自托管视频用原生标签输出,并给出多个清晰度。
<video controls preload="metadata" poster="/thumbnails/lesson-01.jpg" width="100%">
<source src="/videos/lesson-01-1080p.mp4" type="video/mp4" media="(min-width: 1024px)">
<source src="/videos/lesson-01-720p.mp4" type="video/mp4">
您的浏览器不支持 HTML5 视频播放。
</video>
若需要自适应码率,改用 Video.js 或 Plyr 加载 master.m3u8;WordPress 侧的常见做法是装 Presto Player 或 Video.js 官方插件来省掉自己接播放器的工作。
步骤 6:测算成本并设定策略。 用”单视频体积 × 预期观看次数 × 流量单价”估算,超过预算就把该视频改走第三方嵌入。
# 统计视频文件被请求的总流量(按 URL 汇总 GB)
awk '$7 ~ /\.mp4$/ { sum += $10 } END { printf "视频总流量: %.2f GB\n", sum/1073741824 }' \
/var/log/nginx/access.log
常见踩坑
- 直接上传未转码的原片,一个视频 2GB,播放卡且流量爆炸。
- 没加
+faststart,元数据在文件尾部,必须下载完才能开始播放。 - nginx 未启用 mp4 模块,拖动进度条失效或重新缓冲。
- 对 mp4 开了 gzip,白白消耗 CPU 且无收益。
- Range 请求被缓存插件拦截,导致拖动进度报错。
- 案例:某教程站把 40 个课程视频放在源站,未做限速。一次推广活动带来 800 人同时观看,带宽瞬间打满,不仅视频卡死,整个站点都无法访问。事后改为:视频转码到 720P 为主、切片为 HLS 上传对象存储、CDN 加速并按 IP 限速,同时把公开章节改为 B 站嵌入引流。带宽峰值下降 88%。
- 自托管影视、综艺等受版权保护内容,法律风险极高。
- 第三方嵌入后平台视频被下架,页面出现空白播放器且无人察觉。
总结
视频方案是否合适,用两个数字判断:单视频月流量成本是否低于该视频带来的收益,以及完播率是否达标(教程类通常 40% 以上算正常)。行动清单:① 公开内容走第三方嵌入引流;② 付费内容自托管 + 签名链接;③ 视频必须转码,优先 HLS 自适应;④ nginx 启用 mp4 模块并限速;⑤ 关闭视频的 gzip;⑥ 只上传自己拥有版权或已授权的内容。视频之外的资源分发可参考 资源站文件存储与流量成本、WordPress 资源下载站搭建 与 WordPress CDN 加速配置。
