From 00da30d4d636ba2650a8e2561b1ffc8ac0a55ef5 Mon Sep 17 00:00:00 2001 From: xugo Date: Sat, 25 Jan 2025 19:47:34 +0800 Subject: [PATCH] update readme --- README.md | 6 +++++- docs/rtmp.webp | Bin 0 -> 43386 bytes internal/core/media/stream_push.go | 4 ++-- internal/core/sms/node_manager.go | 1 + internal/web/api/api.go | 24 ++++++++++++++++-------- 5 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 docs/rtmp.webp diff --git a/README.md b/README.md index 06e49e4..0fbca85 100644 --- a/README.md +++ b/README.md @@ -58,11 +58,15 @@ Java WVP @648540858 [wvp-GB28181-pro](https://github.com/648540858/wvp-GB28181-p [GB/T28181 全栈开发日记[6]:React 快速接入 jessibuca.js 播放器](https://juejin.cn/post/7462229773982351410) +[GB/T28181 全栈开发日记[7]:实现 RTMP 鉴权与播放](https://juejin.cn/post/7463504223177261119) + 开发中... > 有没有使用资料? -[RTMP 推拉流规则](https://juejin.cn/post/7463046634558718004) +[RTMP 推拉流规则](https://juejin.cn/post/7463124448540934194) + +[如何使用 OBS RTMP 推流到 GB/T28181平台](https://juejin.cn/post/7463350947100786739) 码字中... diff --git a/docs/rtmp.webp b/docs/rtmp.webp new file mode 100644 index 0000000000000000000000000000000000000000..50f5e2a6404df28c9c57fcb28f622ef8c139f03a GIT binary patch literal 43386 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 literal 0 HcmV?d00001 diff --git a/internal/core/media/stream_push.go b/internal/core/media/stream_push.go index e325613..4f22b28 100755 --- a/internal/core/media/stream_push.go +++ b/internal/core/media/stream_push.go @@ -123,7 +123,7 @@ func (c *Core) Publish(ctx context.Context, in PublishInput) error { if !result.IsAuthDisabled { if s := hook.MD5(in.Session + in.Secret); s != in.Sign { slog.Info("推流鉴权失败", "got", in.Sign, "expect", s) - return fmt.Errorf("rtmp secret error, got[%s]", in.Sign) + return fmt.Errorf("Unauthorized, rtmp secret error, got[%s]", in.Sign) } } @@ -163,7 +163,7 @@ func (c *Core) OnPlay(ctx context.Context, in OnPlayInput) error { } if in.Session != result.Session { slog.Info("拉流鉴权失败", "got", in.Session, "expect", result.Session) - return fmt.Errorf("session error, got[%s]", in.Session) + return fmt.Errorf("Unauthorized, session error, got[%s]", in.Session) } return nil } diff --git a/internal/core/sms/node_manager.go b/internal/core/sms/node_manager.go index 3dfbe54..25b82a8 100644 --- a/internal/core/sms/node_manager.go +++ b/internal/core/sms/node_manager.go @@ -159,6 +159,7 @@ func (n *NodeManager) connection(server *MediaServer, serverPort int) { hookPrefix := fmt.Sprintf("http://%s:%d/webhook", server.HookIP, serverPort) req := zlm.SetServerConfigRequest{ + RtcExternIP: zlm.NewString(server.IP), GeneralMediaServerID: zlm.NewString(server.ID), HookEnable: zlm.NewString("1"), HookOnFlowReport: zlm.NewString(""), diff --git a/internal/web/api/api.go b/internal/web/api/api.go index 903a10c..1936ff1 100644 --- a/internal/web/api/api.go +++ b/internal/web/api/api.go @@ -98,26 +98,32 @@ func setupRouter(r *gin.Engine, uc *Usecase) { } var session string if !push.IsAuthDisabled && push.Session != "" { - session = "?session=" + push.Session + session = "session=" + push.Session } + // 播放规则 + // https://github.com/zlmediakit/ZLMediaKit/wiki/%E6%92%AD%E6%94%BEurl%E8%A7%84%E5%88%99 return &playOutput{ App: push.App, Stream: push.Stream, Items: []streamAddrItem{ { Label: "默认线路", - WSFLV: fmt.Sprintf("ws://%s:%d/%s.live.flv", host, svr.Ports.WsFLV, stream), - HTTPFLV: fmt.Sprintf("http://%s:%d/%s.live.flv", host, svr.Ports.FLV, stream), - RTMP: fmt.Sprintf("rtmp://%s:%d/%s", host, svr.Ports.RTMP, stream) + session, - RTSP: fmt.Sprintf("rtsp://%s:%d/%s", host, svr.Ports.RTSP, stream), + WSFLV: fmt.Sprintf("ws://%s:%d/%s.live.flv", host, svr.Ports.HTTP, stream) + "?" + session, + HTTPFLV: fmt.Sprintf("http://%s:%d/%s.live.flv", host, svr.Ports.HTTP, stream) + "?" + session, + RTMP: fmt.Sprintf("rtmp://%s:%d/%s", host, svr.Ports.RTMP, stream) + "?" + session, + RTSP: fmt.Sprintf("rtsp://%s:%d/%s", host, svr.Ports.RTSP, stream) + "?" + session, + WebRTC: fmt.Sprintf("webrtc://%s:%d/index/api/webrtc?app=%s&stream=%s&type=play", host, svr.Ports.HTTP, push.App, push.Stream) + "&" + session, + HLS: fmt.Sprintf("http://%s:%d/%s/hls.fmp4.m3u8", host, svr.Ports.HTTP, stream) + "?" + session, }, { Label: "SSL 线路", - WSFLV: fmt.Sprintf("wss://%s:%d/%s.live.flv", host, svr.Ports.WsFLVs, stream), - HTTPFLV: fmt.Sprintf("https://%s:%d/%s.live.flv", host, svr.Ports.FLVs, stream), + WSFLV: fmt.Sprintf("wss://%s:%d/%s.live.flv", host, svr.Ports.HTTP, stream) + session, + HTTPFLV: fmt.Sprintf("https://%s:%d/%s.live.flv", host, svr.Ports.HTTP, stream) + session, RTMP: fmt.Sprintf("rtmps://%s:%d/%s", host, svr.Ports.RTMPs, stream) + session, - RTSP: fmt.Sprintf("rtsps://%s:%d/%s", host, svr.Ports.RTSPs, stream), + RTSP: fmt.Sprintf("rtsps://%s:%d/%s", host, svr.Ports.RTSPs, stream) + session, + WebRTC: fmt.Sprintf("webrtc://%s:%d/index/api/webrtc?app=%s&stream=%s&type=play", host, svr.Ports.HTTPS, push.App, push.Stream) + "&" + session, + HLS: fmt.Sprintf("https://%s:%d/%s/hls.fmp4.m3u8", host, svr.Ports.HTTPS, stream) + "?" + session, }, }, }, nil @@ -135,6 +141,8 @@ type streamAddrItem struct { HTTPFLV string `json:"http_flv"` RTMP string `json:"rtmp"` RTSP string `json:"rtsp"` + WebRTC string `json:"webrtc"` + HLS string `json:"hls"` } type getHealthOutput struct {