diff --git a/internal/recorder/format_fmp4.go b/internal/recorder/format_fmp4.go index 14edce17..fe86a9a5 100644 --- a/internal/recorder/format_fmp4.go +++ b/internal/recorder/format_fmp4.go @@ -880,13 +880,6 @@ func (f *formatFMP4) initialize() bool { func (f *formatFMP4) close() { if f.currentSegment != nil { - for _, track := range f.tracks { - if track.nextSample != nil && - timestampToDuration(track.nextSample.dts, int(track.initTrack.TimeScale)) > f.currentSegment.lastDTS { - f.currentSegment.lastDTS = timestampToDuration(track.nextSample.dts, int(track.initTrack.TimeScale)) - } - } - f.currentSegment.close() //nolint:errcheck } } diff --git a/internal/recorder/format_fmp4_part.go b/internal/recorder/format_fmp4_part.go index d38637ba..185972c9 100644 --- a/internal/recorder/format_fmp4_part.go +++ b/internal/recorder/format_fmp4_part.go @@ -94,7 +94,11 @@ func (p *formatFMP4Part) write(track *formatFMP4Track, sample *sample, dts time. } partTrack.Samples = append(partTrack.Samples, sample.Sample) - p.endDTS = dts + + endDTS := dts + timestampToDuration(int64(sample.Duration), int(track.initTrack.TimeScale)) + if endDTS > p.endDTS { + p.endDTS = endDTS + } return nil } diff --git a/internal/recorder/format_fmp4_segment.go b/internal/recorder/format_fmp4_segment.go index 7976f578..caf1dc7b 100644 --- a/internal/recorder/format_fmp4_segment.go +++ b/internal/recorder/format_fmp4_segment.go @@ -106,11 +106,11 @@ type formatFMP4Segment struct { path string fi *os.File curPart *formatFMP4Part - lastDTS time.Duration + endDTS time.Duration } func (s *formatFMP4Segment) initialize() { - s.lastDTS = s.startDTS + s.endDTS = s.startDTS } func (s *formatFMP4Segment) close() error { @@ -123,8 +123,8 @@ func (s *formatFMP4Segment) close() error { if s.fi != nil { s.f.ri.Log(logger.Debug, "closing segment %s", s.path) - // write overall duration in the header in order to speed up the playback server - duration := s.lastDTS - s.startDTS + // write overall duration in the header to speed up the playback server + duration := s.endDTS - s.startDTS err2 := writeDuration(s.fi, duration) if err == nil { err = err2 @@ -144,7 +144,10 @@ func (s *formatFMP4Segment) close() error { } func (s *formatFMP4Segment) write(track *formatFMP4Track, sample *sample, dts time.Duration) error { - s.lastDTS = dts + endDTS := dts + timestampToDuration(int64(sample.Duration), int(track.initTrack.TimeScale)) + if endDTS > s.endDTS { + s.endDTS = endDTS + } if s.curPart == nil { s.curPart = &formatFMP4Part{ diff --git a/internal/recorder/format_fmp4_track.go b/internal/recorder/format_fmp4_track.go index 189c4610..49b331d7 100644 --- a/internal/recorder/format_fmp4_track.go +++ b/internal/recorder/format_fmp4_track.go @@ -72,7 +72,6 @@ func (t *formatFMP4Track) write(sample *sample) error { if (!t.f.hasVideo || t.initTrack.Codec.IsVideo()) && !t.nextSample.IsNonSyncSample && (nextDTS-t.f.currentSegment.startDTS) >= t.f.ri.segmentDuration { - t.f.currentSegment.lastDTS = nextDTS err := t.f.currentSegment.close() if err != nil { return err