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 }