1.
说明:CDN 能降低延迟、消减源站带宽并增强并发;流式(HLS/DASH)支持按需分片、快进和自适应码率,适合移动与桌面。
要点:本文以 PHP 为中心,覆盖如何生成 HLS/DASH、在 CDN 上发布、用签名 URL 控制权限并用前端播放器保证兼容性。
2.
步骤:准备原始 MP4/原始视频文件;安装 ffmpeg(用于切片)和 PHP 环境(例如 PHP7+)。
小分段:目标格式优先 HLS(.m3u8 + .ts)用于 iOS 原生,DASH(.mpd + .mp4/frag)用于部分浏览器和低延迟场景。
3.
示例命令(生成多码率):
ffmpeg -i input.mp4 -preset veryfast -g 48 -sc_threshold 0 \
-map 0:v:0 -map 0:a:0 -s:v:0 1280x720 -b:v:0 3000k -maxrate:v:0 3210k -bufsize:v:0 6000k \
-map 0:v:0 -map 0:a:0 -s:v:1 854x480 -b:v:1 1200k -maxrate:v:1 1284k -bufsize:v:1 2400k \
-var_stream_map "v:0,a:0 v:1,a:0" -master_pl_name master.m3u8 \
-f hls -hls_time 6 -hls_playlist_type vod -hls_segment_filename "v%v/fileSequence%d.ts" v%v/prog_index.m3u8
说明:生成 master.m3u8 与分辨率子 m3u8。上传这些文件到源站或对象存储。
4.
步骤:把生成的 m3u8 和 ts 推到 S3/OSS/对象存储;在 CDN 控制台新建 Pull Zone,设置源站为对象存储的 URL。
配置项:开启支持 Range 请求、正确的 MIME(m3u8 -> application/vnd.apple.mpegurl,ts -> video/mp2t),设置缓存规则和缓存失效策略。
5.
思路:为防盗链,用带过期时间和签名的 URL。示例(伪码):
$url = '/path/to/master.m3u8'; $expiry = time()+3600; $secret='KEY'; $token = hash_hmac('sha256', $url.'|'.$expiry, $secret); $signed = $url.'?exp='.$expiry.'&sig='.$token; echo $signed;
部署提示:签名规则需与 CDN 或后端验证一致;对于对象存储,可能在 CDN 层做签名或用存储提供的预签名 URL。
6.
Headers:设置正确的 Content-Type、Accept-Ranges: bytes、Cache-Control,根据需要加上 Access-Control-Allow-Origin:* 或指定域名。
缓存策略:m3u8 可设置短缓存(例如 30s),ts 段可设置较长缓存,遇到实时或低延迟需求调整 hls_time 与缓存。
7.
推荐:使用 video.js + hls.js(非 iOS),在 iOS Safari 可直接使用 HTML5 video 加 HLS 原生支持。
示例 HTML(伪代码):
<video id="player" controls></video>
<script>if(Hls.isSupported()){var hls=new Hls();hls.loadSource('SIGNED_URL_HERE');hls.attachMedia(document.getElementById('player'));}else{document.getElementById('player').src='SIGNED_URL_HERE';}</script>
8.
iOS:仅支持 HLS 原生,不需 hls.js;DASH 在 iOS 上不被原生支持。
安卓与桌面:现代浏览器可用 hls.js 播 HLS,也可用 dash.js 播 DASH。注意 MSE 支持和 CORS。
9.
验证 URL:用 curl -I 检查 Content-Type、Accept-Ranges、Cache-Control;用浏览器 DevTools 看网络请求与 206 响应。
日志:检查 CDN 报表、源站访问日志,若出现 403/404,先验证签名和路径是否一致、对象存储权限是否公开或已授权。
10.
答:用 HMAC 签名结合过期时间。步骤:1) 统一 URL 路径规则;2) 在 PHP 中计算 token=hash_hmac('sha256', path+'|'+expiry, secret);3) 将 ?exp=expiry&sig=token 附加到 URL;4) 在 CDN 回源或应用层验证签名与 expiry,拒绝过期或签名不符的请求。
11.
答:优先发布 HLS(适配 iOS);同时提供 DASH(用于支持 DASH 的浏览器)。前端根据环境选择:iOS 用原生 video;其他现代浏览器用 hls.js 或 dash.js 回退。确保 CORS、MIME、Range 支持和自适应码率切片。
12.
答:排查顺序:1) 用 curl -I 检查响应头(Content-Type、Access-Control-Allow-Origin、Accept-Ranges);2) 检查签名和过期时间;3) 查看对象存储权限与 CDN 源站回源设置;4) CDN 控制台查看缓存规则与防盗链配置;5) 若为 206 问题,确保源支持 Range 并返回 Accept-Ranges。
