diff --git a/track/aac.go b/track/aac.go index 5f901ba..bd62465 100644 --- a/track/aac.go +++ b/track/aac.go @@ -62,6 +62,10 @@ func (aac *AAC) WriteADTS(ts uint32, adts []byte) { // https://datatracker.ietf.org/doc/html/rfc3640#section-3.2.1 func (aac *AAC) WriteRTPFrame(frame *RTPFrame) { + if aac.SampleRate != 90000 { + aac.generateTimestamp(uint32(uint64(frame.Timestamp) * 90000 / uint64(aac.SampleRate))) + } + defer aac.Flush() auHeaderLen := util.ReadBE[int](frame.Payload[:aac.Mode]) >> 3 //通常为2,即一个AU Header的长度 // auHeaderCount := auHeaderLen >> 1 // AU Header的个数, 通常为1 if auHeaderLen == 0 { diff --git a/track/g711.go b/track/g711.go index 1458f3e..3128002 100644 --- a/track/g711.go +++ b/track/g711.go @@ -54,5 +54,9 @@ func (g711 *G711) WriteAVCC(ts uint32, frame *util.BLL) error { } func (g711 *G711) WriteRTPFrame(frame *RTPFrame) { + if g711.SampleRate != 90000 { + g711.generateTimestamp(uint32(uint64(frame.Timestamp) * 90000 / uint64(g711.SampleRate))) + } g711.AppendAuBytes(frame.Payload) + g711.Flush() } diff --git a/track/h264.go b/track/h264.go index efa5fdb..e57af1c 100644 --- a/track/h264.go +++ b/track/h264.go @@ -123,6 +123,10 @@ func (vt *H264) WriteRTPFrame(frame *RTPFrame) { } } frame.SequenceNumber += vt.rtpSequence //增加偏移,需要增加rtp包后需要顺延 + if frame.Marker { + vt.generateTimestamp(frame.Timestamp) + vt.Flush() + } } // RTP格式补完 diff --git a/track/h265.go b/track/h265.go index fc280ae..a83e203 100644 --- a/track/h265.go +++ b/track/h265.go @@ -115,6 +115,10 @@ func (vt *H265) WriteRTPFrame(frame *RTPFrame) { vt.WriteSliceBytes(frame.Payload) } frame.SequenceNumber += vt.rtpSequence //增加偏移,需要增加rtp包后需要顺延 + if frame.Marker { + vt.generateTimestamp(frame.Timestamp) + vt.Flush() + } } // RTP格式补完 diff --git a/track/rtp.go b/track/rtp.go index 6522585..92979a3 100644 --- a/track/rtp.go +++ b/track/rtp.go @@ -33,16 +33,11 @@ func (av *Media) UnmarshalRTP(raw []byte) (frame *RTPFrame) { } func (av *Media) writeRTPFrame(frame *RTPFrame) { + if len(frame.Payload) == 0 { + return + } av.Value.RTP.PushValue(*frame) av.WriteRTPFrame(frame) - if frame.Marker { - if av.SampleRate != 90000 { - av.SpesificTrack.generateTimestamp(uint32(uint64(frame.Timestamp) * 90000 / uint64(av.SampleRate))) - } else { - av.SpesificTrack.generateTimestamp(frame.Timestamp) - } - av.SpesificTrack.Flush() - } } // WriteRTPPack 写入已反序列化的RTP包 diff --git a/util/reorder_test.go b/util/reorder_test.go new file mode 100644 index 0000000..72f1c27 --- /dev/null +++ b/util/reorder_test.go @@ -0,0 +1,38 @@ +package util + +import ( + "testing" +) + +type stuff struct { + seq uint16 +} + +func (s *stuff) Clone() *stuff { + return s +} + +func TestReorder(t *testing.T) { + t.Run(t.Name(), func(t *testing.T) { + var recoder RTPReorder[*stuff] + for i := (uint16)(0); i < 25; i++ { + recoder.Push(i*2, &stuff{seq: i * 2}) + } + if recoder.Pop() != nil { + t.Error("pop nil") + } + for i := (uint16)(0); i < 25; i++ { + x := recoder.Push(i*2+1, &stuff{seq: i*2 + 1}) + if x != nil { + t.Logf("%d", x.seq) + } + for { + if x = recoder.Pop(); x == nil { + break + } else { + t.Logf("%d", x.seq) + } + } + } + }) +}