From bb8c02b9f0fd7286df2dce36b6927fe2a60bce48 Mon Sep 17 00:00:00 2001 From: Alessandro Ros Date: Sat, 7 Oct 2023 17:36:57 +0200 Subject: [PATCH] fix 'fragment sequence discontinuity' warning when reading record segments with VLC (#2476) --- go.mod | 2 +- go.sum | 4 ++-- internal/record/agent.go | 13 +++++++------ internal/record/part.go | 20 ++++++++++++-------- internal/record/segment.go | 6 ++++-- 5 files changed, 26 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 98f69b5a..66ae78b8 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aler9/writerseeker v1.1.0 github.com/bluenviron/gohlslib v1.0.3 github.com/bluenviron/gortsplib/v4 v4.2.0 - github.com/bluenviron/mediacommon v1.4.1-0.20231007133411-92ec4e147f89 + github.com/bluenviron/mediacommon v1.4.1-0.20231007152904-4c7d799a3253 github.com/datarhei/gosrt v0.5.4 github.com/fsnotify/fsnotify v1.6.0 github.com/gin-gonic/gin v1.9.1 diff --git a/go.sum b/go.sum index b30e6fc1..81d7a437 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/bluenviron/gohlslib v1.0.3 h1:FMHevlIrrZ67uzCXmlTSGflsfYREEtHb8L9BDyf github.com/bluenviron/gohlslib v1.0.3/go.mod h1:R/aIsSxLI61N0CVMjtcHqJouK6+Ddd5YIihcCr7IFIw= github.com/bluenviron/gortsplib/v4 v4.2.0 h1:EbIMqkFxFo/iG5Hkld+Flew9R8ORKnuxlgUyFdpd5Rk= github.com/bluenviron/gortsplib/v4 v4.2.0/go.mod h1:wz9d4Tn2qS/mexc+BnvNeWzlNOpyaHzNK6SXxtg4mfM= -github.com/bluenviron/mediacommon v1.4.1-0.20231007133411-92ec4e147f89 h1:IEicF/CpzU78BJ95v0XwTWL5D2Kr2grlpe5jnuhbRN8= -github.com/bluenviron/mediacommon v1.4.1-0.20231007133411-92ec4e147f89/go.mod h1:Ij/kE1LEucSjryNBVTyPL/gBI0d6/Css3f5PyrM957w= +github.com/bluenviron/mediacommon v1.4.1-0.20231007152904-4c7d799a3253 h1:r98CMlefqn1U/mYHifWD9Udb52E8axvjUkv70FJV2qQ= +github.com/bluenviron/mediacommon v1.4.1-0.20231007152904-4c7d799a3253/go.mod h1:Ij/kE1LEucSjryNBVTyPL/gBI0d6/Css3f5PyrM957w= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= diff --git a/internal/record/agent.go b/internal/record/agent.go index baaa637a..5ce1c2e3 100644 --- a/internal/record/agent.go +++ b/internal/record/agent.go @@ -114,12 +114,13 @@ type Agent struct { onSegmentComplete func(string) parent logger.Writer - ctx context.Context - ctxCancel func() - writer *asyncwriter.Writer - tracks []*track - hasVideo bool - currentSegment *segment + ctx context.Context + ctxCancel func() + writer *asyncwriter.Writer + tracks []*track + hasVideo bool + currentSegment *segment + nextSequenceNumber uint32 done chan struct{} } diff --git a/internal/record/part.go b/internal/record/part.go index a9dd6ec5..32b7e9fd 100644 --- a/internal/record/part.go +++ b/internal/record/part.go @@ -12,7 +12,7 @@ import ( "github.com/bluenviron/mediamtx/internal/logger" ) -func writePart(f io.Writer, partTracks map[*track]*fmp4.PartTrack) error { +func writePart(f io.Writer, sequenceNumber uint32, partTracks map[*track]*fmp4.PartTrack) error { fmp4PartTracks := make([]*fmp4.PartTrack, len(partTracks)) i := 0 for _, partTrack := range partTracks { @@ -21,7 +21,8 @@ func writePart(f io.Writer, partTracks map[*track]*fmp4.PartTrack) error { } part := &fmp4.Part{ - Tracks: fmp4PartTracks, + SequenceNumber: sequenceNumber, + Tracks: fmp4PartTracks, } var ws writerseeker.WriterSeeker @@ -35,8 +36,9 @@ func writePart(f io.Writer, partTracks map[*track]*fmp4.PartTrack) error { } type part struct { - s *segment - startDTS time.Duration + s *segment + sequenceNumber uint32 + startDTS time.Duration partTracks map[*track]*fmp4.PartTrack endDTS time.Duration @@ -44,12 +46,14 @@ type part struct { func newPart( s *segment, + sequenceNumber uint32, startDTS time.Duration, ) *part { return &part{ - s: s, - startDTS: startDTS, - partTracks: make(map[*track]*fmp4.PartTrack), + s: s, + startDTS: startDTS, + sequenceNumber: sequenceNumber, + partTracks: make(map[*track]*fmp4.PartTrack), } } @@ -77,7 +81,7 @@ func (p *part) close() error { p.s.f = f } - return writePart(p.s.f, p.partTracks) + return writePart(p.s.f, p.sequenceNumber, p.partTracks) } func (p *part) record(track *track, sample *sample) error { diff --git a/internal/record/segment.go b/internal/record/segment.go index 06c527ed..224a1471 100644 --- a/internal/record/segment.go +++ b/internal/record/segment.go @@ -76,7 +76,8 @@ func (s *segment) close() error { func (s *segment) record(track *track, sample *sample) error { if s.curPart == nil { - s.curPart = newPart(s, sample.dts) + s.curPart = newPart(s, s.r.nextSequenceNumber, sample.dts) + s.r.nextSequenceNumber++ } else if s.curPart.duration() >= s.r.partDuration { err := s.curPart.close() s.curPart = nil @@ -85,7 +86,8 @@ func (s *segment) record(track *track, sample *sample) error { return err } - s.curPart = newPart(s, sample.dts) + s.curPart = newPart(s, s.r.nextSequenceNumber, sample.dts) + s.r.nextSequenceNumber++ } return s.curPart.record(track, sample)