From 9357e8799f7cb4b13cc6ee31f6d25a09957af457 Mon Sep 17 00:00:00 2001 From: dexter <178529795@qq.com> Date: Sat, 24 Sep 2022 21:01:11 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20FIX:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=B8=8Esrs=E6=9C=8D=E5=8A=A1=E5=99=A8=E4=BA=92=E8=81=94?= =?UTF-8?q?=E4=B8=8D=E9=80=9A=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- amf.go | 8 ++++---- client.go | 2 +- media.go | 25 ++++++++++++------------- msg.go | 18 ++++++++++-------- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/amf.go b/amf.go index d7de928..73275e8 100644 --- a/amf.go +++ b/amf.go @@ -160,8 +160,8 @@ func (amf *AMF) readDate() uint64 { func (amf *AMF) readStrictArray() (list []AMFValue) { amf.ReadByte() - size := amf.ReadUint16() - for i := uint16(0); i < size; i++ { + size := amf.ReadUint32() + for i := uint32(0); i < size; i++ { list = append(list, amf.decodeObject()) } return @@ -170,8 +170,8 @@ func (amf *AMF) readStrictArray() (list []AMFValue) { func (amf *AMF) readECMAArray() (m AMFObject) { m = make(AMFObject, 0) amf.ReadByte() - size := amf.ReadUint16() - for i := uint16(0); i < size; i++ { + size := amf.ReadUint32() + for i := uint32(0); i < size; i++ { k := amf.readString1() v := amf.decodeObject() if k == "" && v == ObjectEnd { diff --git a/client.go b/client.go index 4e414b3..1f6e103 100644 --- a/client.go +++ b/client.go @@ -50,7 +50,7 @@ func NewRTMPClient(addr string) (client *NetConnection, err error) { "app": client.appName, "flashVer": "monibuca/" + engine.Engine.Version, "swfUrl": addr, - "tcUrl": addr, + "tcUrl": strings.TrimSuffix(addr, u.Path) + "/" + client.appName, }, nil, }) diff --git a/media.go b/media.go index 671005b..03bba54 100644 --- a/media.go +++ b/media.go @@ -119,18 +119,18 @@ func (r *RTMPReceiver) ReceiveAudio(msg *Chunk) { r.WriteAVCCAudio(0, msg.Body) return } - // plugin.Tracef("rec_audio chunkType:%d chunkStreamID:%d ts:%d", msg.ChunkType, msg.ChunkStreamID, msg.Timestamp) + ts := msg.Timestamp + if ts == 0xffffff { + ts = msg.ExtendTimestamp + } if msg.ChunkType == 0 { if r.AudioTrack.GetBase().Name == "" { r.absTs[msg.ChunkStreamID] = 0 } else { - r.absTs[msg.ChunkStreamID] = r.AudioTrack.PreFrame().AbsTime + r.absTs[msg.ChunkStreamID] = ts } - } - if msg.Timestamp == 0xffffff { - r.absTs[msg.ChunkStreamID] += msg.ExtendTimestamp } else { - r.absTs[msg.ChunkStreamID] += msg.Timestamp + r.absTs[msg.ChunkStreamID] += ts } r.AudioTrack.WriteAVCC(r.absTs[msg.ChunkStreamID], msg.Body) } @@ -140,19 +140,18 @@ func (r *RTMPReceiver) ReceiveVideo(msg *Chunk) { r.WriteAVCCVideo(0, msg.Body) return } - // plugin.Tracef("rev_video chunkType:%d chunkStreamID:%d ts:%d", msg.ChunkType, msg.ChunkStreamID, msg.Timestamp) + ts := msg.Timestamp + if ts == 0xffffff { + ts = msg.ExtendTimestamp + } if msg.ChunkType == 0 { if r.VideoTrack.GetBase().Name == "" { r.absTs[msg.ChunkStreamID] = 0 } else { - r.absTs[msg.ChunkStreamID] = r.VideoTrack.PreFrame().AbsTime + r.absTs[msg.ChunkStreamID] = ts } - } - if msg.Timestamp == 0xffffff { - r.absTs[msg.ChunkStreamID] += msg.ExtendTimestamp } else { - r.absTs[msg.ChunkStreamID] += msg.Timestamp + r.absTs[msg.ChunkStreamID] += ts } - r.VideoTrack.WriteAVCC(r.absTs[msg.ChunkStreamID], msg.Body) } diff --git a/msg.go b/msg.go index b621df7..ad85988 100644 --- a/msg.go +++ b/msg.go @@ -334,7 +334,9 @@ func decodeCommandAMF0(chunk *Chunk) { chunk.MsgData = response } case "FCPublish", "FCUnpublish": + fallthrough default: + chunk.MsgData = &struct{ CommandMessage }{cmdMsg} RTMPPlugin.Info("decode command amf0 ", zap.String("cmd", cmd)) } } @@ -505,16 +507,16 @@ func (msg *PlayMessage) Encode() []byte { amf.writeNumber(float64(msg.TransactionId)) amf.writeNull() amf.writeString(msg.StreamName) + amf.writeNumber(-2000) + // if msg.Start > 0 { + // amf.writeNumber(msg.Start) + // } - if msg.Start > 0 { - amf.writeNumber(msg.Start) - } + // if msg.Duration > 0 { + // amf.writeNumber(msg.Duration) + // } - if msg.Duration > 0 { - amf.writeNumber(msg.Duration) - } - - amf.writeBool(msg.Reset) + // amf.writeBool(msg.Reset) return amf.Buffer }