想给自己的视频加道锁?用 shaka-packager 做 DASH/HLS 加密打包
做内容的人最怕两件事:被白嫖搬运,和被随意篡改。网站端往往靠播放器里那套 DRM 来防护,但如果你只是想给自家资源加一层"不是谁都能随便下"的保护,没必要一上来就接 Widevine 那套复杂的授权服务。这篇文章聊的是更轻量的做法:用 shaka-packager 把视频打成加密的 DASH/HLS,配一个 Clear Key 就能跑。
加密到底在保护什么
先泼盆冷水:客户端能播,就意味着密钥迟早会出现在内存里。所谓加密打包,防的是"直接右键另存为拿到明文",而不是"铁板一块防破解"。所以它适合保护普通版权内容、内部培训资料这类场景;真要顶级防护,还是得上 Widevine/PlayReady 的授权服务器。
安装 shaka-packager
去官方 GitHub releases 下载预编译二进制,或者用包管理器:
# macOS
brew install shaka-packager
# 或者下载后放进 PATH
单文件加密打包成 DASH
假设手上是 input.mp4,想输出加密的 fMP4 + MPD 清单:
packager \
in=input.mp4,stream=video,init_segment=video_init.mp4,segment_template=video_$Number$.m4s \
in=input.mp4,stream=audio,init_segment=audio_init.mp4,segment_template=audio_$Number$.m4s \
--enable_media_encryption \
--keys label=:key_id=deadbeefdeadbeefdeadbeefdeadbeef:key=00112233445566778899aabbccddeeff \
--mpd_output manifest.mpd
key_id 和 key 都是 16 字节的十六进制。key_id 是声明给播放端的标识,key 才是真正的密钥。Clear Key 模式下,播放端只要拿到这对值就能解——所以密钥别写死在前端代码里,至少从接口动态取。
打成 HLS 也差不多
packager \
in=input.mp4,stream=video,init_segment=video_init.mp4,segment_template=video_$Number$.ts,hls_group_id=vid \
in=input.mp4,stream=audio,init_segment=audio_init.mp4,segment_template=audio_$Number$.ts,hls_group_id=aud \
--enable_media_encryption \
--keys label=:key_id=deadbeefdeadbeefdeadbeefdeadbeef:key=00112233445566778899aabbccddeeff \
--hls_master_playlist_output master.m3u8
Clear Key 还是 Widevine?
| 方案 | 部署成本 | 防护强度 | 适合 |
|---|---|---|---|
| 不加密 | 无 | 零 | 公开内容 |
| Clear Key | 低 | 防小白 | 内部资料、普通版权 |
| Widevine | 高(要授权服务) | 高 | 商业付费内容 |
常见问题
Q:浏览器能直接播加密 DASH 吗? 可以,Shaka Player、dash.js 都支持 Clear Key,把密钥通过 EME 接口喂进去即可。
Q:加密后还能用 ffmpeg 转码吗? 不能,得先解密。打包是分发环节的活,剪辑转码在打包之前完成。
Q:密钥泄露了怎么办? Clear Key 场景只能换 key 重新打包;这也是它不适合高价值内容的原因。