m3u8鉴权相关

常用方案

  • Referer
  • User-Agent
  • EXT-SECRET-KEY配合ffmpeg加密方式(用处不大)
  • m3u8下载即焚
  • ts文件时效性
  • m3u8文件后端混淆,前端解开混淆
  • M3U8 二级目录提供 ts 的下载链接,可以动态生成,多久后链接失效
  • 视频水印
  • drm加密

网上的方案 V2EX网友

1.在使用 FFmpeg 切片时,切片脚本设置为每个视频单独生成解密 key 文件. 并 base64_encode 存储数据库
2.同时切片配置信息的#EXT-X-KEY 设置为进行播放鉴权的 url
3.切片后文件上传阿里云 OSS 并对播放域名开启 CDN 鉴权
4.后端返回前端 m3u8 文件地址时,在地址后面加上当前请求播放用户的加密信息.
5.播放器使用 m3u8 获取 ts 文件时,触发阿里云 cdn 重写,将加密用户信息提交到自己设置的鉴权中心
6.鉴权中心,对用户身份,视频播放有效期,请求次数进行鉴权后,从数据库取出 key 字段进行 base64_decode 解密
7.播放器获得解密 key 进行播放
以上可以用户在获取 m3u8 和播放时都需要进行鉴权,同时都有时效限制.每个视频也都是不同秘钥.可以提高下载门槛
如果前端功底好的话可以在播放器 js 中进行对 m3u8 的操作进一步提高安全性.

参考资料

https://github.com/hauk0101/video-hls-encrypt

live-go

手动更新 channel key

每次重启项目后 旧的channel key将不能使用需要重新获取一次才可以(channel key 不变)

1
http://127.0.0.1:8090/control/reset?room=<ROOM_NAME>

channel key在每次请求reset后旧的将会失效

获取最新的channel key

1
http://localhost:8090/control/get?room=<ROOM_NAME>

手动模拟推送

1
ffmpeg -re -i demo.flv -c copy -f flv rtmp://localhost:1935/<appname>/<channel key>

OBS直播推送

下载地址:OBS Studio

推流配置
推流配置

Dplayer播放器模拟播放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Web Live Demo</title>
<style type="text/css">
#dplayer {
height: 800px;
width: 400px;
}

#video .dplayer-menu-show {
display: none
}
</style>
</head>
<body>
<div id="dplayer"></div>
<script src="https://cdn.bootcdn.net/ajax/libs/flv.js/1.5.0/flv.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/dplayer/1.25.1/DPlayer.min.js"></script>
<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script>
<script type="text/javascript">
var url = "http://localhost:7001/live/movie.flv"; //这里填写视频地址
var id = md5(url);
const dp = new DPlayer({
container: document.getElementById('dplayer'),
live: true,
autoplay: true,
contextmenu: [
{
text: '风向标',
link: 'https://sbcoder.cn',
},
],
airplay: true,
video: {
url: url,
},
});
</script>
</body>
</html>