EasyNVR平台实现播流地址超时无法播放功能过程分享
Posted EasyNVR
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EasyNVR平台实现播流地址超时无法播放功能过程分享相关的知识,希望对你有一定的参考价值。
EasyNVR平台中会生成 hls、flv、ws-flv 等多种流,当用户获取对应的流地址后,可以一直播放,因此需要对流地址进行超时管理,如果超时后无法播放。
设计方案如下:
1、首先在生成的播流地址中添加 expire参数,即播流地址为:
http://127.0.0.1:10800/flv/hls/stream_1.flv?expire=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MjIxMTIxNTAsImlzcyI6InRzaW5nc2VlLWVhc3ludnIifQ.DlKQtcQZuYi0NcL_bWZWrWU1KDAMGueb8jwBxK_vqzc ;
2、如果播流地址中不包含 expire 参数,则返回无权限播放;
3、如果播流地中包含 expire 参数,解析参数过期时间,如果超时,则返回无权限播放。
expire 的生成代码如下:
func GeneratePlayToken(expireTime time.Time) (string, error) {
//设置token有效时间
/*nowTime:=time.Now()
expireTime:=nowTime.Add(3*time.Hour)*/
claims := jwt.StandardClaims{
// 过期时间
ExpiresAt: expireTime.Unix(),
// 指定token发行人
Issuer: "tsingsee-easynvr",
}
tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
//该方法内部生成签名字符串,再用于获取完整、已签名的token
token, err := tokenClaims.SignedString(jwtSecret)
return token, err
}
解析 expire 的代码如下:
// 返回 token 是否有效
func ParsePlayToken(token string) (bool, int, error) {
//用于解析鉴权的声明,方法内部主要是具体的解码和校验的过程,最终返回*Token
tokenClaims, err := jwt.ParseWithClaims(token, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
return jwtSecret, nil
})
if tokenClaims != nil {
// 从tokenClaims中获取到Claims对象,并使用断言,将该对象转换为我们自己定义的Claims
// 要传入指针,项目中结构体都是用指针传递,节省空间。
if claims, ok := tokenClaims.Claims.(*jwt.StandardClaims); ok && tokenClaims.Valid {
dura := int(claims.ExpiresAt - time.Now().Unix())
if dura > 0 {
return true, dura, nil
} else {
return false, 0, nil
}
}
return false, 0, nil
}
return false, 0, err
}
最终前端地址包含对应的 expire 信息。
以上是关于EasyNVR平台实现播流地址超时无法播放功能过程分享的主要内容,如果未能解决你的问题,请参考以下文章
EasyNVR如何获取RTSP格式的视频流?三种获取RTSP地址方式介绍
EasyNVR通过国标级联到上级云服务器,视频无法播放的原因是什么?
EasyNVR非按需拉流返回的RTMP流地址无法播放如何处理?
RTSP/Onvif协议视频平台EasyNVR如何配置用户的视频流播放时长?