Browse Source

fix 'fragment sequence discontinuity' warning when reading record segments with VLC (#2476)

pull/2455/head
Alessandro Ros 2 years ago committed by GitHub
parent
commit
bb8c02b9f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      go.mod
  2. 4
      go.sum
  3. 13
      internal/record/agent.go
  4. 20
      internal/record/part.go
  5. 6
      internal/record/segment.go

2
go.mod

@ -9,7 +9,7 @@ require ( @@ -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

4
go.sum

@ -16,8 +16,8 @@ github.com/bluenviron/gohlslib v1.0.3 h1:FMHevlIrrZ67uzCXmlTSGflsfYREEtHb8L9BDyf @@ -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=

13
internal/record/agent.go

@ -114,12 +114,13 @@ type Agent struct { @@ -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{}
}

20
internal/record/part.go

@ -12,7 +12,7 @@ import ( @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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 {

6
internal/record/segment.go

@ -76,7 +76,8 @@ func (s *segment) close() error { @@ -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 { @@ -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)

Loading…
Cancel
Save