From 07591c75141a1486c01a1a6d90fc40c55dd714be Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Sun, 24 Apr 2022 13:01:27 +0200 Subject: [PATCH] hls muxer: update primary playlist in case SPS/PPS changed --- internal/hls/muxer_primary_playlist.go | 49 ++++++++++++-------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/internal/hls/muxer_primary_playlist.go b/internal/hls/muxer_primary_playlist.go index dd1c90c0..93f507cb 100644 --- a/internal/hls/muxer_primary_playlist.go +++ b/internal/hls/muxer_primary_playlist.go @@ -1,7 +1,6 @@ package hls import ( - "bytes" "encoding/hex" "io" "strconv" @@ -13,42 +12,38 @@ import ( type muxerPrimaryPlaylist struct { videoTrack *gortsplib.TrackH264 audioTrack *gortsplib.TrackAAC - - cnt []byte } func newMuxerPrimaryPlaylist( videoTrack *gortsplib.TrackH264, audioTrack *gortsplib.TrackAAC, ) *muxerPrimaryPlaylist { - p := &muxerPrimaryPlaylist{ + return &muxerPrimaryPlaylist{ videoTrack: videoTrack, audioTrack: audioTrack, } - - var codecs []string - - if p.videoTrack != nil { - sps := p.videoTrack.SPS() - if len(sps) >= 4 { - codecs = append(codecs, "avc1."+hex.EncodeToString(sps[1:4])) - } - } - - // https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter - if p.audioTrack != nil { - codecs = append(codecs, "mp4a.40."+strconv.FormatInt(int64(p.audioTrack.Type()), 10)) - } - - p.cnt = []byte("#EXTM3U\n" + - "#EXT-X-VERSION:3\n" + - "\n" + - "#EXT-X-STREAM-INF:BANDWIDTH=200000,CODECS=\"" + strings.Join(codecs, ",") + "\"\n" + - "stream.m3u8\n") - - return p } func (p *muxerPrimaryPlaylist) reader() io.Reader { - return bytes.NewReader(p.cnt) + return &asyncReader{generator: func() []byte { + var codecs []string + + if p.videoTrack != nil { + sps := p.videoTrack.SPS() + if len(sps) >= 4 { + codecs = append(codecs, "avc1."+hex.EncodeToString(sps[1:4])) + } + } + + // https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter + if p.audioTrack != nil { + codecs = append(codecs, "mp4a.40."+strconv.FormatInt(int64(p.audioTrack.Type()), 10)) + } + + return []byte("#EXTM3U\n" + + "#EXT-X-VERSION:3\n" + + "\n" + + "#EXT-X-STREAM-INF:BANDWIDTH=200000,CODECS=\"" + strings.Join(codecs, ",") + "\"\n" + + "stream.m3u8\n") + }} }