前言
公司最近在接入攝像頭,但是攝像頭返回的流地址是rtsp格式的,前端無法直接播放。經(jīng)過調(diào)研后,決定采用ffmpeg進行轉(zhuǎn)碼,推流到srs,再由前端進行獲取。srs可以支持集群、回調(diào)等功能,可以更好的進行以后需求的擴展。特此記錄利用回調(diào)功能實現(xiàn)鑒權,指定流才能播放。
安裝
安裝采用docker安裝的方式比較快捷,但是因為需要回調(diào)需要修改配置,所以利用docker啟動了srs后,需要將配置文件復制出來掛載到本地,再利用本地的配置進行啟動。
- 按照官方文檔的
docker啟動:
docker run --rm -it -d -p 1935:1935 -p 1985:1985 -p 8081:8080 registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4 ./objs/srs -c conf/srs.conf
- 將配置文件拷貝出來:
docker cp -a 0007d673a2b3:/usr/local/srs/conf ~/Downloads/srs/conf
docker cp -a 0007d673a2b3:/usr/local/srs/objs ~/Downloads/srs/objs
- 使用本地文件掛載啟動
srs
docker run --rm -it -d -p 1935:1935 -p 1985:1985 -p 8081:8080 -v ~/Downloads/srs/conf/:/usr/local/srs/conf/ -v ~/Downloads/srs/objs/:/usr/local/srs/objs/ registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4
簡單測試一下推流:
ffmpeg -i "rtsp://admin:admin@123@192.168.2.60:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif" -c copy -f flv -y rtmp://127.0.0.1/live/livestream
使用vlc,選擇open network stream填入rtmp://127.0.0.1/live/livestream可以播放。
回調(diào)
將拉流的地址后面加上后綴,流可以可以播放,例如rtmp://127.0.0.1/live/livestream?token=1實際上也是沒有影響的,如果設置了回調(diào),那么srs會將原地址后的所有字符串(例如?token=1)當做附加信息發(fā)送給回調(diào)方。
現(xiàn)在,假設需要判斷當一個客戶端打開某個流地址時,這個流是否真的可以播放,那么可以設置on_play回調(diào);如果需要監(jiān)聽客戶端何時斷開連接,從而也可以回收先前起的ffmpeg進程,可以設置on_close回調(diào),其他需求可以查看官方文檔說明。
修改掛載在本地的~/Downloads/srs/conf/srs.conf文件,在vhost__defaultVhost__下添加http_hooks:
# 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;
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#config-candidate
candidate $CANDIDATE;
}
vhost __defaultVhost__ {
hls {
enabled on;
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
rtc {
enabled on;
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#rtmp-to-rtc
rtmp_to_rtc off;
# @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#rtc-to-rtmp
rtc_to_rtmp off;
}
http_hooks{
# 開啟回調(diào)
enabled on;
# 播放流時回調(diào)
on_play http://192.168.18.60:8888/check;
# 關閉流時回調(diào)
on_close http://192.168.18.60:8888/close;
}
更新完新的conf文件后,重啟一下srs即可。
對于回調(diào)接口的限制,只需要在成功時返回0,返回其他任何數(shù)字都認為是失敗。在controller中添加對應的回調(diào)接口:
@PostMapping(value = "/check")
public Integer check(@RequestBody Object object) {
// 可以在object中的param字段里獲取流的附加信息,比如取出token進行校驗,通過返回0,否則返回-1
System.out.println(object);
return 0;
}
此時也可以在srs的日志中看到當有客戶端連接時發(fā)送了請求:
[2021-12-08 06:36:57.076][Trace][1][t2r7a856] http: on_play ok, client_id=t2r7a856, url=http://192.168.18.60:8888/check, request={"server_id":"vid-kh7490t","action":"on_play","client_id":"t2r7a856","ip":"172.17.0.1","vhost":"__defaultVhost__","app":"live","stream":"livestream","param":"?token=1","pageUrl":""}, response=0
request里的內(nèi)容會被發(fā)送到指定的回調(diào)接口。
關閉流的接口也是類似,在此不贅述了。