提示

返回博客列表

想给自己的视频加道锁?用 shaka-packager 做 DASH/HLS 加密打包

想给自己的视频加道锁?用 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_idkey 都是 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 重新打包;这也是它不适合高价值内容的原因。

想亲手试试?用 VidDown 一键解析下载

粘贴视频链接即可解析,多平台支持、网页端即用;下载桌面客户端解锁海外平台本地解析,开通会员更享不限次下载。

顶部