mirror of
https://github.com/bluenviron/mediamtx.git
synced 2025-12-25 04:22:00 -08:00
hls: fix blocking playlists
when hlsVariant is lowLatency and hlsSegmentCount is not 7, segment IDs where assigned erroneously.
This commit is contained in:
parent
a018f214bc
commit
4c0833664d
4 changed files with 19 additions and 15 deletions
|
|
@ -173,10 +173,10 @@ func TestMuxerVideoAudio(t *testing.T) {
|
|||
`\n` +
|
||||
`#EXT-X-PROGRAM-DATE-TIME:(.*?)\n` +
|
||||
`#EXTINF:4.00000,\n` +
|
||||
`(.+?\.mp4)\n` +
|
||||
`(seg0\.mp4)\n` +
|
||||
`#EXT-X-PROGRAM-DATE-TIME:(.*?)\n` +
|
||||
`#EXTINF:1.00000,\n` +
|
||||
`(.+?\.mp4)\n$`)
|
||||
`(seg1\.mp4)\n$`)
|
||||
ma = re.FindStringSubmatch(string(byts))
|
||||
}
|
||||
require.NotEqual(t, 0, len(ma))
|
||||
|
|
@ -507,10 +507,10 @@ func TestMuxerVideoOnly(t *testing.T) {
|
|||
`\n` +
|
||||
`#EXT-X-PROGRAM-DATE-TIME:(.*?)\n` +
|
||||
`#EXTINF:4.00000,\n` +
|
||||
`(.+?\.mp4)\n` +
|
||||
`(seg0\.mp4)\n` +
|
||||
`#EXT-X-PROGRAM-DATE-TIME:(.*?)\n` +
|
||||
`#EXTINF:1.00000,\n` +
|
||||
`(.+?\.mp4)\n$`)
|
||||
`(seg1\.mp4)\n$`)
|
||||
ma = re.FindStringSubmatch(string(byts))
|
||||
}
|
||||
require.NotEqual(t, 0, len(ma))
|
||||
|
|
@ -731,10 +731,10 @@ func TestMuxerAudioOnly(t *testing.T) {
|
|||
`\n` +
|
||||
`#EXT-X-PROGRAM-DATE-TIME:(.*?)\n` +
|
||||
`#EXTINF:2.32200,\n` +
|
||||
`(.+?\.mp4)\n` +
|
||||
`(seg0\.mp4)\n` +
|
||||
`#EXT-X-PROGRAM-DATE-TIME:(.*?)\n` +
|
||||
`#EXTINF:0.02322,\n` +
|
||||
`(.+?\.mp4)\n$`)
|
||||
`(seg1\.mp4)\n$`)
|
||||
ma = re.FindStringSubmatch(string(byts))
|
||||
}
|
||||
require.NotEqual(t, 0, len(ma))
|
||||
|
|
|
|||
|
|
@ -333,7 +333,7 @@ func (p *muxerVariantFMP4Playlist) fullPlaylist(isDeltaUpdate bool) io.Reader {
|
|||
}
|
||||
|
||||
cnt += "#EXTINF:" + strconv.FormatFloat(seg.renderedDuration.Seconds(), 'f', 5, 64) + ",\n" +
|
||||
seg.name() + ".mp4\n"
|
||||
seg.name + ".mp4\n"
|
||||
|
||||
case *muxerVariantFMP4Gap:
|
||||
cnt += "#EXT-X-GAP\n" +
|
||||
|
|
@ -449,7 +449,7 @@ func (p *muxerVariantFMP4Playlist) onSegmentFinalized(segment *muxerVariantFMP4S
|
|||
}
|
||||
}
|
||||
|
||||
p.segmentsByName[segment.name()] = segment
|
||||
p.segmentsByName[segment.name] = segment
|
||||
p.segments = append(p.segments, segment)
|
||||
p.nextSegmentID = segment.id + 1
|
||||
p.nextSegmentParts = p.nextSegmentParts[:0]
|
||||
|
|
@ -463,7 +463,7 @@ func (p *muxerVariantFMP4Playlist) onSegmentFinalized(segment *muxerVariantFMP4S
|
|||
}
|
||||
p.parts = p.parts[len(toDeleteSeg.parts):]
|
||||
|
||||
delete(p.segmentsByName, toDeleteSeg.name())
|
||||
delete(p.segmentsByName, toDeleteSeg.name)
|
||||
}
|
||||
|
||||
p.segments = p.segments[1:]
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ type muxerVariantFMP4Segment struct {
|
|||
genPartID func() uint64
|
||||
onPartFinalized func(*muxerVariantFMP4Part)
|
||||
|
||||
name string
|
||||
size uint64
|
||||
parts []*muxerVariantFMP4Part
|
||||
currentPart *muxerVariantFMP4Part
|
||||
|
|
@ -79,6 +80,7 @@ func newMuxerVariantFMP4Segment(
|
|||
audioTrack: audioTrack,
|
||||
genPartID: genPartID,
|
||||
onPartFinalized: onPartFinalized,
|
||||
name: "seg" + strconv.FormatUint(id, 10),
|
||||
}
|
||||
|
||||
s.currentPart = newMuxerVariantFMP4Part(
|
||||
|
|
@ -90,10 +92,6 @@ func newMuxerVariantFMP4Segment(
|
|||
return s
|
||||
}
|
||||
|
||||
func (s *muxerVariantFMP4Segment) name() string {
|
||||
return "seg" + strconv.FormatUint(s.id, 10)
|
||||
}
|
||||
|
||||
func (s *muxerVariantFMP4Segment) reader() io.Reader {
|
||||
return &partsReader{parts: s.parts}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ func newMuxerVariantFMP4Segmenter(
|
|||
onSegmentFinalized func(*muxerVariantFMP4Segment),
|
||||
onPartFinalized func(*muxerVariantFMP4Part),
|
||||
) *muxerVariantFMP4Segmenter {
|
||||
return &muxerVariantFMP4Segmenter{
|
||||
m := &muxerVariantFMP4Segmenter{
|
||||
lowLatency: lowLatency,
|
||||
segmentDuration: segmentDuration,
|
||||
partDuration: partDuration,
|
||||
|
|
@ -89,9 +89,15 @@ func newMuxerVariantFMP4Segmenter(
|
|||
audioTrack: audioTrack,
|
||||
onSegmentFinalized: onSegmentFinalized,
|
||||
onPartFinalized: onPartFinalized,
|
||||
nextSegmentID: uint64(segmentCount),
|
||||
sampleDurations: make(map[time.Duration]struct{}),
|
||||
}
|
||||
|
||||
// add initial gaps, required by iOS LL-HLS
|
||||
if m.lowLatency {
|
||||
m.nextSegmentID = 7
|
||||
}
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
func (m *muxerVariantFMP4Segmenter) genSegmentID() uint64 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue