SRS視頻服務(wù)器基于DRM防盜鏈實(shí)現(xiàn)直播分享

利用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)行播放)

image.png

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容