利用srs视频服务器的DRM防盗链功能实现直播分享功能,配合服务端对指定直播分享指定时长的能力。

注意:srs版本必须是5.0或以上

srs github: https://github.com/ossrs/srs
DRM防盗链文档地址:https://ossrs.io/lts/zh-cn/docs/v5/doc/drm

抄录DRM说明:

DRM重要的功能就是防盗链,只有允许的用户,才能访问服务器的流。有多种DRM的方式:

  • referer防盗链:检查用户从哪个网站过来的。譬如不是从公司的页面过来的人都不让看。
  • token防盗链:用户在播放时,必须先申请token,SRS会回调http检查这个token合法性。
  • FMS token tranverse:边缘RTMP服务器收到每个连接,都去上行节点验证,即token穿越认证。
  • Access服务器:专门的access服务器负责DRM。譬如adobe的access服务器。
  • 推流认证:adobe的RTMP推流时,支持几种认证方式,这个也可以归于防盗链概念。
实现思路

这里我们采用token防盗链,具体为下面几个步骤:
1.在自己编写的服务端中实现直播分享接口,接口产生一个token,放入redis中设置过期时间,比如90天
2.用户通过页面上直播分享能力请求直播分享接口得到一个直播页面链接,链接参数中携带这个token
3.被分享用户访问链接,链接访问我们自己的页面,页面自动获取链接参数中的token,利用token拼接成直播播放链接请求播放
4.srs服务器收到直播请求后自动携带token请求我们提前编写好的鉴权接口,鉴权接口从redis中比对token是否有效,返回成功或失败依次来控制srs服务器是否返回直播流给用户

使用docker-compose搭建srs视频服务器

配置srs.conf,将token校验接口换成我们自己编写的接口地址,修改http_hooks的on_play地址,如果有其他需求也可以修改相应的地址

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# main config for srs.
# @see full.conf for detail config.

listen 1935;
max_connections 1000;
#srs_log_tank file;
#srs_log_file ./objs/srs.log;
daemon on;
http_api {
enabled on;
listen 1985;
}
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
rtc_server {
enabled on;
listen 8000; # UDP port
# @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidate
candidate $CANDIDATE;
}
vhost __defaultVhost__ {
hls {
enabled on;
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
rtc {
enabled on;
# @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtmp-to-rtc
rtmp_to_rtc off;
# @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtc-to-rtmp
rtc_to_rtmp off;
}
# http 回调
http_hooks {

# 事件:发生该事件时,即回调指定的HTTP地址。
# HTTP地址:可以支持多个,以空格分隔,SRS会依次回调这些接口。
# 数据:SRS将数据POST到HTTP接口。
# 返回值:SRS要求HTTP服务器返回HTTP200并且response内容为整数错误码(0表示成功),其他错误码会断开客户端连接。

# whether the http hooks enable.
# default off.
enabled on;

# 当客户端连接到指定的vhost和app时
#on_connect http://127.0.0.1:8085/api/v1/clients http://localhost:8085/api/v1/clients;

# 当客户端关闭连接,或者SRS主动关闭连接时
#on_close http://127.0.0.1:8085/api/v1/clients http://localhost:8085/api/v1/clients;

# 当客户端发布流时,譬如flash/FMLE方式推流到服务器
#on_publish http://127.0.0.1:8085/api/v1/streams http://localhost:8085/api/v1/streams;

# 当客户端停止发布流时
# on_unpublish http://127.0.0.1:8085/api/v1/streams http://localhost:8085/api/v1/streams;

# 当客户端开始播放流时,这里就是我自己的服务接口地址
on_play http://192.168.90.141:8092/ossrs/v1/token;

# 当客户端停止播放时。备注:停止播放可能不会关闭连接,还能再继续播放。
#on_stop http://127.0.0.1:8085/api/v1/sessions http://localhost:8085/api/v1/sessions;

# 当DVR录制关闭一个flv文件时
#on_dvr http://127.0.0.1:8085/api/v1/dvrs http://localhost:8085/api/v1/dvrs;

# 当HLS生成一个ts文件时
#on_hls http://127.0.0.1:8085/api/v1/hls http://localhost:8085/api/v1/hls;

# when srs reap a ts file of hls, call this hook,
#on_hls_notify http://127.0.0.1:8085/api/v1/hls/[app]/[stream]/[ts_url][param];
}

play{
gop_cache_max_frames 2500;
}
}

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
version: '2'
services:
  emqx:
    image: registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5
    hostname: "srs"
    ports:
      - 1935:1935
      - 1985:1985
      - 8080:8080
    volumes:
      - ./srs.conf:/usr/local/srs/conf/srs.conf
    restart: always

运行docker-compose up -d运行srs视频服务器

再通过下面命令推送一个视频到srs服务器进行测试:

1
docker run --rm -it registry.cn-hangzhou.aliyuncs.com/ossrs/srs:encoder ffmpeg -stream_loop -1 -re -i doc/source.flv -c copy -f flv rtmp://127.0.0.1/live/test123

使用播放器播放http://127.0.0.1:8080/live/test123.flv?token=88195f8943e5c944066725df2b1706f8(可以访问http://127.0.0.1:8080/进入本地控制器页面进行播放)

image.png

此时我们服务端程序接口就能收到这个token,校验失败就返回错误的http状态码,校验成功就返回200的状态码,就可以控制播放器是否能播放