From ce1f0f96814796ac5a4b2ba1cefaf9c55adbe327 Mon Sep 17 00:00:00 2001 From: madao Date: Wed, 5 Feb 2025 00:12:41 +0800 Subject: [PATCH] rtmp connection encrypt support --- go.mod | 4 +- go.sum | 4 +- .../flvadmin/rtmpflvwriter/rtmpflvwriter.go | 19 ++++++++- src/rtsp2rtmp/rtmpserver/rtmpserver.go | 5 ++- src/rtsp2rtmp/tcpclient/rtmp_push_manager.go | 41 +++++++++++++++++++ 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 80fcb46..73c3114 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( github.com/beego/beego/v2 v2.0.1 - // github.com/deepch/vdk v0.0.0-20241120073805-439b6309323c //gitUrl v0.0.0-timestamp-commitId + // github.com/deepch/vdk v0.0.0-20241120073805-439b6309323c //gitUrl v0.0.0-timestamp-commitId //timestamp为0时区的时间,commitId为前12为 github.com/deepch/vdk v0.0.27 github.com/gin-gonic/gin v1.7.2 github.com/go-cmd/cmd v1.4.3 @@ -13,4 +13,4 @@ require ( github.com/matoous/go-nanoid/v2 v2.1.0 ) -replace github.com/deepch/vdk => github.com/hkmadao/vdk v0.0.0-20241127071358-df60b9bc5ae8 +replace github.com/deepch/vdk => github.com/hkmadao/vdk v0.0.0-20250204160314-c07ed611e735 diff --git a/go.sum b/go.sum index ecd13bc..4fd04c6 100644 --- a/go.sum +++ b/go.sum @@ -151,8 +151,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hkmadao/vdk v0.0.0-20241127071358-df60b9bc5ae8 h1:uc354yQx2guZSJHPZtQh32Q5NQHAWsqPlm00R3dSYac= -github.com/hkmadao/vdk v0.0.0-20241127071358-df60b9bc5ae8/go.mod h1:JlgGyR2ld6+xOIHa7XAxJh+stSDBAkdNvIPkUIdIywk= +github.com/hkmadao/vdk v0.0.0-20250204160314-c07ed611e735 h1:1MUoJJ/gcIM/hS+Ng6vrp23ZiykbXpqwZZcIoHKIwT4= +github.com/hkmadao/vdk v0.0.0-20250204160314-c07ed611e735/go.mod h1:JlgGyR2ld6+xOIHa7XAxJh+stSDBAkdNvIPkUIdIywk= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20220517205856-0058ec4f073c/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= diff --git a/src/rtsp2rtmp/flvadmin/rtmpflvwriter/rtmpflvwriter.go b/src/rtsp2rtmp/flvadmin/rtmpflvwriter/rtmpflvwriter.go index 96a0ec4..c461211 100644 --- a/src/rtsp2rtmp/flvadmin/rtmpflvwriter/rtmpflvwriter.go +++ b/src/rtsp2rtmp/flvadmin/rtmpflvwriter/rtmpflvwriter.go @@ -5,6 +5,7 @@ import ( "sync" "time" + "github.com/beego/beego/v2/core/config" "github.com/beego/beego/v2/core/logs" "github.com/deepch/vdk/av" "github.com/deepch/vdk/format/rtmp" @@ -104,7 +105,23 @@ func (rfw *RtmpFlvWriter) createConn() error { logs.Error("not found camera : %s", rfw.code) return err } - rtmpConn, err := rtmp.Dial(camera.RtmpUrl) + clientCode, err := config.String("server.remote.client-code") + if err != nil { + logs.Error("get remote client-code error: %v\n", err) + return err + } + signSecret, err := config.String("server.remote.sign-secret") + if err != nil { + logs.Error("get remote sign-secret error: %v\n", err) + return err + } + secretStr, err := config.String("server.remote.secret") + if err != nil { + logs.Error("get remote secret error: %v", err) + return err + } + proxyConnOption := rtmp.NewProxyConnOption(rtmp.AES, clientCode, signSecret, []byte(secretStr)) + rtmpConn, err := rtmp.DialEncrypt(camera.RtmpUrl, proxyConnOption) if err != nil { logs.Error("rtmp client connection error : %v", err) return err diff --git a/src/rtsp2rtmp/rtmpserver/rtmpserver.go b/src/rtsp2rtmp/rtmpserver/rtmpserver.go index e973563..dd0649e 100644 --- a/src/rtsp2rtmp/rtmpserver/rtmpserver.go +++ b/src/rtsp2rtmp/rtmpserver/rtmpserver.go @@ -95,7 +95,10 @@ func (r *rtmpServer) startRtmp() { Addr: ":" + strconv.Itoa(rtmpPort), HandleConn: r.handleRtmpConn, } - s.ListenAndServe() + + if err := s.ListenAndServe(); err != nil { + logs.Error("encrypt rtmp ListenAndServe error: %v", err) + } } func (r *rtmpServer) handleRtmpConn(conn *rtmp.Conn) { diff --git a/src/rtsp2rtmp/tcpclient/rtmp_push_manager.go b/src/rtsp2rtmp/tcpclient/rtmp_push_manager.go index 23701a8..955b502 100644 --- a/src/rtsp2rtmp/tcpclient/rtmp_push_manager.go +++ b/src/rtsp2rtmp/tcpclient/rtmp_push_manager.go @@ -8,6 +8,7 @@ import ( "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin" "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/tcpclient/tcpclientcommon" "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common" + base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base" ) type RtmpPushParam struct { @@ -34,6 +35,26 @@ func startRtmpPush(commandMessage tcpclientcommon.CommandMessage) { } return } + condition := common.GetEqualCondition("code", param.CameraCode) + camera, err := base_service.CameraFindOneByCondition(condition) + if err != nil { + logs.Error("startPushRtmp: find camera: %s error: %v", param.CameraCode, err) + result := common.ErrorResult(fmt.Sprintf("startPushRtmp: find camera: %s error: %v", param.CameraCode, err)) + _, err = tcpclientcommon.WriteResult(result, conn) + if err != nil { + logs.Error(err) + return + } + } + if !camera.FgPassive { + logs.Error("startPushRtmp: camera: %s fgPassive is false", param.CameraCode) + result := common.ErrorResult(fmt.Sprintf("startPushRtmp: camera: %s fgPassive is false", param.CameraCode)) + _, err = tcpclientcommon.WriteResult(result, conn) + if err != nil { + logs.Error(err) + return + } + } flvadmin.GetSingleRtmpFlvAdmin().RemoteStartWrite(param.CameraCode) result := common.SuccessResultData("startPushRtmp success") @@ -64,6 +85,26 @@ func stopRtmpPush(commandMessage tcpclientcommon.CommandMessage) { } return } + condition := common.GetEqualCondition("code", param.CameraCode) + camera, err := base_service.CameraFindOneByCondition(condition) + if err != nil { + logs.Error("stopPushRtmp: find camera: %s error: %v", param.CameraCode, err) + result := common.ErrorResult(fmt.Sprintf("stopPushRtmp: find camera: %s error: %v", param.CameraCode, err)) + _, err = tcpclientcommon.WriteResult(result, conn) + if err != nil { + logs.Error(err) + return + } + } + if !camera.FgPassive { + logs.Error("stopPushRtmp: camera: %s fgPassive is false", param.CameraCode) + result := common.ErrorResult(fmt.Sprintf("stopPushRtmp: camera: %s fgPassive is false", param.CameraCode)) + _, err = tcpclientcommon.WriteResult(result, conn) + if err != nil { + logs.Error(err) + return + } + } flvadmin.GetSingleRtmpFlvAdmin().RemoteStopWrite(param.CameraCode) defer conn.Close()