TSINGSEE青犀視頻雲邊端架構中很多產品由於開發架構類似,因此功能的實現過程或者出現的問題等都有類似的地方。比如我們先測試了EasyGBS演示模式下視頻播放的問題,隨後就發現了EasyNVR視頻平臺也出現了同樣類似的問題。
EasyNVR演示模式下獲取到的RTSP地址無法播放,演示模式是之前添加的新功能,主要是爲了實現在演示模式下,播放幾分鐘後(這個幾分鐘可以在配置文件配置的)斷流,讓這個流不能在播放。
func wrapURLWithLiveToken(rawURL string, c *gin.Context) (wrapURL string) {
wrapURL = rawURL
demo := utils.Conf().Section("base_config").Key("demo").MustBool(false)
if !demo {
return
}
if rawURL == "" {
return
}
_url, err := url.Parse(rawURL)
if err != nil {
return
}
q := _url.Query()
//token := utils.MD5(sessions.Default(c).ID() + rawURL)
token := createRandomString(8)
q.Set("token", token)
_url.RawQuery = q.Encode()
wrapURL = _url.String()
liveTokenCache.SetDefault(token, wrapURL)
return
}
該處代碼就是在流地址後面添加token的地方。
目前EasyNVR對外提供的流有這幾種格式的:WS-FLV、HTTP-FLV、HLS、RTMP、RTSP,其中前4種格式都是可以播放的,只有RTSP流地址比較特殊,該流地址後不能添加標識符,不然不能播放,我們將其排除出去即可。
if _url, ok := ack.EasyDarwin.Body["URL"].(string); ok {
if !strings.EqualFold(params["protocol"], "RTSP") {
ack.EasyDarwin.Body["URL"] = wrapURLWithLiveToken(_url, c)
}
}
這個地方先判斷,如果想要獲取RTSP流地址,就不進行token後綴的添加。
這樣返回的RTSP流地址就不會帶有token後綴。