diff --git a/common/frame.go b/common/frame.go index 987f0bc..544f7c8 100644 --- a/common/frame.go +++ b/common/frame.go @@ -142,6 +142,8 @@ func (av *AVFrame[T]) Reset() { av.Raw = av.Raw[:0] } av.BytesIn = 0 + av.AbsTime = 0 + av.DeltaTime = 0 } func (avcc AVCCFrame) IsIDR() bool { diff --git a/common/ring_av.go b/common/ring_av.go index bfe39fb..a33c187 100644 --- a/common/ring_av.go +++ b/common/ring_av.go @@ -14,9 +14,9 @@ type AVRing[T RawSlice] struct { func (r *AVRing[T]) Step() *AVFrame[T] { current := r.RingBuffer.MoveNext() - current.Sequence = r.MoveCount current.canRead = false current.Reset() + current.Sequence = r.MoveCount r.LastValue.canRead = true return current } diff --git a/subscriber.go b/subscriber.go index 622cb31..64fa952 100644 --- a/subscriber.go +++ b/subscriber.go @@ -312,9 +312,9 @@ func (s *Subscriber) PlayBlock(subType byte) { break } } - if vstate < SUBSTATE_NORMAL { - continue - } + // if vstate < SUBSTATE_NORMAL { + // continue + // } } // 正常模式下或者纯音频模式下,音频开始播放 if hasAudio { diff --git a/track/audio.go b/track/audio.go index 1eaee64..97be1d3 100644 --- a/track/audio.go +++ b/track/audio.go @@ -93,9 +93,7 @@ func (av *Audio) WriteRaw(pts uint32, raw []byte) { } func (av *Audio) WriteAVCC(ts uint32, frame AVCCFrame) { - curValue := &av.Value - curValue.BytesIn += len(frame) - curValue.AppendAVCC(frame) + av.Media.WriteAVCC(ts, frame) av.generateTimestamp(ts * 90) av.Flush() } diff --git a/track/base.go b/track/base.go index d721710..4da574f 100644 --- a/track/base.go +++ b/track/base.go @@ -130,29 +130,30 @@ func (av *Media[T]) generateTimestamp(ts uint32) { func (av *Media[T]) WriteAVCC(ts uint32, frame AVCCFrame) { curValue := &av.Value - cts := frame.CTS() + curValue.AbsTime = ts curValue.BytesIn += len(frame) curValue.AppendAVCC(frame) - curValue.DTS = ts * 90 - curValue.PTS = (ts + cts) * 90 // av.Stream.Tracef("WriteAVCC:ts %d,cts %d,len %d", ts, cts, len(frame)) } func (av *Media[T]) Flush() { curValue, preValue := &av.Value, av.LastValue + // 补完RTP if config.Global.EnableRTP && len(curValue.RTP) == 0 { av.CompleteRTP(curValue) } + // 补完AVCC if config.Global.EnableAVCC && len(curValue.AVCC) == 0 { av.CompleteAVCC(curValue) } if av.起始时间.IsZero() { - curValue.AbsTime = curValue.DTS / 90 + curValue.DeltaTime = 0 av.重置(curValue.AbsTime) - } else { + } else if curValue.AbsTime == 0 { curValue.DeltaTime = (curValue.DTS - preValue.DTS) / 90 - // println(curValue.DeltaTime ,curValue.DTS , preValue.DTS) curValue.AbsTime = preValue.AbsTime + curValue.DeltaTime + } else { + curValue.DeltaTime = curValue.AbsTime - preValue.AbsTime } av.Base.Flush(&curValue.BaseFrame) if av.等待上限 > 0 { diff --git a/track/video.go b/track/video.go index 027de3f..f8bc62b 100644 --- a/track/video.go +++ b/track/video.go @@ -132,6 +132,8 @@ func (vt *Video) WriteAnnexB(pts uint32, dts uint32, frame AnnexBFrame) { func (vt *Video) WriteAVCC(ts uint32, frame AVCCFrame) { vt.Value.IFrame = frame.IsIDR() vt.Media.WriteAVCC(ts, frame) + vt.Value.DTS = ts * 90 + vt.Value.PTS = (ts + frame.CTS()) * 90 for nalus := frame[5:]; len(nalus) > vt.nalulenSize; { nalulen := util.ReadBE[int](nalus[:vt.nalulenSize]) if nalulen == 0 { @@ -227,13 +229,13 @@ func (vt *Video) CompleteAVCC(rv *AVFrame[NALUSlice]) { } func (vt *Video) Flush() { - if vt.Value.IFrame { + rv := &vt.Value + if rv.IFrame { vt.computeGOP() } if vt.Attached == 0 && vt.IDRing != nil && vt.DecoderConfiguration.Seq > 0 { defer vt.Attach() } - rv := &vt.Value // 没有实际媒体数据 if len(rv.Raw) == 0 { rv.Reset()