利用srs視頻服務(wù)器的DRM防盜鏈功能實(shí)現(xiàn)直播分享功能,配合服務(wù)端對(duì)指定直播分享指定時(shí)長(zhǎng)的能力。
注意:srs版本必須是5.0或以上
srs github: https://github.com/ossrs/srs
DRM防盜鏈文檔地址:https://ossrs.io/lts/zh-cn/docs/v5/doc/drm
抄錄DRM說(shuō)明:
DRM重要的功能就是防盜鏈,只有允許的用戶,才能訪問(wèn)服務(wù)器的流。有多種DRM的方式:
- referer防盜鏈:檢查用戶從哪個(gè)網(wǎng)站過(guò)來(lái)的。譬如不是從公司的頁(yè)面過(guò)來(lái)的人都不讓看。
- token防盜鏈:用戶在播放時(shí),必須先申請(qǐng)token,SRS會(huì)回調(diào)http檢查這個(gè)token合法性。
- FMS token tranverse:邊緣RTMP服務(wù)器收到每個(gè)連接,都去上行節(jié)點(diǎn)驗(yàn)證,即token穿越認(rèn)證。
- Access服務(wù)器:專門(mén)的access服務(wù)器負(fù)責(zé)DRM。譬如adobe的access服務(wù)器。
- 推流認(rèn)證:adobe的RTMP推流時(shí),支持幾種認(rèn)證方式,這個(gè)也可以歸于防盜鏈概念。
實(shí)現(xiàn)思路
這里我們采用token防盜鏈,具體為下面幾個(gè)步驟:
1.在自己編寫(xiě)的服務(wù)端中實(shí)現(xiàn)直播分享接口,接口產(chǎn)生一個(gè)token,放入redis中設(shè)置過(guò)期時(shí)間,比如90天
2.用戶通過(guò)頁(yè)面上直播分享能力請(qǐng)求直播分享接口得到一個(gè)直播頁(yè)面鏈接,鏈接參數(shù)中攜帶這個(gè)token
3.被分享用戶訪問(wèn)鏈接,鏈接訪問(wèn)我們自己的頁(yè)面,頁(yè)面自動(dòng)獲取鏈接參數(shù)中的token,利用token拼接成直播播放鏈接請(qǐng)求播放
4.srs服務(wù)器收到直播請(qǐng)求后自動(dòng)攜帶token請(qǐng)求我們提前編寫(xiě)好的鑒權(quán)接口,鑒權(quán)接口從redis中比對(duì)token是否有效,返回成功或失敗依次來(lái)控制srs服務(wù)器是否返回直播流給用戶
使用docker-compose搭建srs視頻服務(wù)器
配置srs.conf,將token校驗(yàn)接口換成我們自己編寫(xiě)的接口地址,修改http_hooks的on_play地址,如果有其他需求也可以修改相應(yīng)的地址
# 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 回調(diào)
http_hooks {
# 事件:發(fā)生該事件時(shí),即回調(diào)指定的HTTP地址。
# HTTP地址:可以支持多個(gè),以空格分隔,SRS會(huì)依次回調(diào)這些接口。
# 數(shù)據(jù):SRS將數(shù)據(jù)POST到HTTP接口。
# 返回值:SRS要求HTTP服務(wù)器返回HTTP200并且response內(nèi)容為整數(shù)錯(cuò)誤碼(0表示成功),其他錯(cuò)誤碼會(huì)斷開(kāi)客戶端連接。
# whether the http hooks enable.
# default off.
enabled on;
# 當(dāng)客戶端連接到指定的vhost和app時(shí)
#on_connect http://127.0.0.1:8085/api/v1/clients http://localhost:8085/api/v1/clients;
# 當(dāng)客戶端關(guān)閉連接,或者SRS主動(dòng)關(guān)閉連接時(shí)
#on_close http://127.0.0.1:8085/api/v1/clients http://localhost:8085/api/v1/clients;
# 當(dāng)客戶端發(fā)布流時(shí),譬如flash/FMLE方式推流到服務(wù)器
#on_publish http://127.0.0.1:8085/api/v1/streams http://localhost:8085/api/v1/streams;
# 當(dāng)客戶端停止發(fā)布流時(shí)
# on_unpublish http://127.0.0.1:8085/api/v1/streams http://localhost:8085/api/v1/streams;
# 當(dāng)客戶端開(kāi)始播放流時(shí),這里就是我自己的服務(wù)接口地址
on_play http://192.168.90.141:8092/ossrs/v1/token;
# 當(dāng)客戶端停止播放時(shí)。備注:停止播放可能不會(huì)關(guān)閉連接,還能再繼續(xù)播放。
#on_stop http://127.0.0.1:8085/api/v1/sessions http://localhost:8085/api/v1/sessions;
# 當(dāng)DVR錄制關(guān)閉一個(gè)flv文件時(shí)
#on_dvr http://127.0.0.1:8085/api/v1/dvrs http://localhost:8085/api/v1/dvrs;
# 當(dāng)HLS生成一個(gè)ts文件時(shí)
#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
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
運(yùn)行docker-compose up -d運(yùn)行srs視頻服務(wù)器
再通過(guò)下面命令推送一個(gè)視頻到srs服務(wù)器進(jìn)行測(cè)試:
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(可以訪問(wèn)http://127.0.0.1:8080/進(jìn)入本地控制器頁(yè)面進(jìn)行播放)

此時(shí)我們服務(wù)端程序接口就能收到這個(gè)token,校驗(yàn)失敗就返回錯(cuò)誤的http狀態(tài)碼,校驗(yàn)成功就返回200的狀態(tài)碼,就可以控制播放器是否能播放