From cda1808f48b50305e127bec348c8f467f55bdb20 Mon Sep 17 00:00:00 2001 From: dexter <178529795@qq.com> Date: Wed, 16 Mar 2022 00:07:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 32 +++++++++++++++++++++++++------- event.go | 7 ++++--- handshake.go | 3 +-- media.go | 24 ++++++++++++++++++++++-- 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 6c763ed..535b0aa 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # RTMP插件 -## 插件地址 +## 插件源码地址 github.com/Monibuca/plugin-rtmp @@ -14,16 +14,34 @@ import ( ## 默认插件配置 ```yaml -rtmp +rtmp: tcp: + # rtmp 监听端口 listenaddr: :1935 + # rtmp 监听端口 listennum: 0 - chunksize: 512 + # 输出分块大小 + chunksize: 4096 + publish: + pubaudio: true + pubvideo: true + kickexist: false + publishtimeout: 10 + waitclosetimeout: 0 + subscribe: + subaudio: true + subvideo: true + iframeonly: false + waittimeout: 10 + pull: + repull: 0 + pullonstart: false + pullonsubscribe: false + pulllist: {} + push: + repush: 0 + pushlist: {} ``` - -- listenaddr是监听的地址 -- chunksize是输出分块大小 - ## 插件功能 ### 接收RTMP协议的推流 diff --git a/event.go b/event.go index f76ed8b..ecf5433 100644 --- a/event.go +++ b/event.go @@ -19,9 +19,10 @@ const ( NetStream_Play_StreamNotFound = "NetStream.Play.StreamNotFound" // "error" 无法找到传递给 play()方法的 FLV NetStream_Play_Stop = "NetStream.Play.Stop" // "status" 播放已结束 NetStream_Play_Failed = "NetStream.Play.Failed" // "error" 出于此表中列出的原因之外的某一原因(例如订阅者没有读取权限),播放发生了错误 - - NetStream_Play_Switch = "NetStream.Play.Switch" - NetStream_Play_Complete = "NetStream.Play.Complete" + NetStream_Play_PublishNotify = "NetStream.Play.PublishNotify" // "status" 发布者已经发布了流 + NetStream_Play_UnpublishNotify = "NetStream.Play.UnpublishNotify" // "status" 发布者已经取消发布了流 + NetStream_Play_Switch = "NetStream.Play.Switch" + NetStream_Play_Complete = "NetStream.Play.Complete" NetStream_Data_Start = "NetStream.Data.Start" diff --git a/handshake.go b/handshake.go index 2673075..5af0205 100644 --- a/handshake.go +++ b/handshake.go @@ -121,9 +121,8 @@ func (nc *NetConnection) complex_handshake(C1 []byte) error { return err } - fmt.Printf("digested handshake, scheme : %v\nchallenge : %v\ndigest : %v\nok : %v\nerr : %v\n", scheme, challenge, digest, ok, err) - if !ok { + fmt.Printf("digested handshake, scheme : %v\nchallenge : %v\ndigest : %v\nok : %v\nerr : %v\n", scheme, challenge, digest, ok, err) return errors.New("validateClient failed") } diff --git a/media.go b/media.go index e990217..3156856 100644 --- a/media.go +++ b/media.go @@ -88,6 +88,17 @@ type RTMPReceiver struct { absTs map[uint32]uint32 } +func (r *RTMPReceiver) OnEvent(event any) { + switch event.(type) { + case SEwaitPublish: + r.Response(1, NetStream_Play_UnpublishNotify, Response_OnStatus) + case SEpublish: + r.Response(1, NetStream_Play_PublishNotify, Response_OnStatus) + default: + r.Publisher.OnEvent(event) + } +} + func (r *RTMPReceiver) Response(tid uint64, code, level string) error { m := new(ResponsePublishMessage) m.CommandName = Response_OnStatus @@ -104,7 +115,11 @@ func (r *RTMPReceiver) Response(tid uint64, code, level string) error { func (r *RTMPReceiver) ReceiveAudio(msg *Chunk) { // plugin.Tracef("rec_audio chunkType:%d chunkStreamID:%d ts:%d", msg.ChunkType, msg.ChunkStreamID, msg.Timestamp) if msg.ChunkType == 0 { - r.absTs[msg.ChunkStreamID] = 0 + if r.AudioTrack.GetName() == "" { + r.absTs[msg.ChunkStreamID] = 0 + } else { + r.absTs[msg.ChunkStreamID] = r.AudioTrack.PreFrame().AbsTime + } } if msg.Timestamp == 0xffffff { r.absTs[msg.ChunkStreamID] += msg.ExtendTimestamp @@ -116,12 +131,17 @@ func (r *RTMPReceiver) ReceiveAudio(msg *Chunk) { func (r *RTMPReceiver) ReceiveVideo(msg *Chunk) { // plugin.Tracef("rev_video chunkType:%d chunkStreamID:%d ts:%d", msg.ChunkType, msg.ChunkStreamID, msg.Timestamp) if msg.ChunkType == 0 { - r.absTs[msg.ChunkStreamID] = 0 + if r.VideoTrack.GetName() == "" { + r.absTs[msg.ChunkStreamID] = 0 + } else { + r.absTs[msg.ChunkStreamID] = r.VideoTrack.PreFrame().AbsTime + } } if msg.Timestamp == 0xffffff { r.absTs[msg.ChunkStreamID] += msg.ExtendTimestamp } else { r.absTs[msg.ChunkStreamID] += msg.Timestamp } + r.VideoTrack.WriteAVCC(r.absTs[msg.ChunkStreamID], msg.Body) }