Skip to content

Commit c509743

Browse files
committed
Fix: auto recover hls player
1 parent c0062f0 commit c509743

File tree

2 files changed

+38
-15
lines changed

2 files changed

+38
-15
lines changed

protocol/hls/source.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ func (source *Source) Close() error {
117117
return av.ErrClosed
118118
}
119119
source.wg.Wait()
120-
// source.cleanup()
121120
close(source.packetQueue)
122121
return nil
123122
}

server/channel.go

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,10 @@ func (c *Channel) AddPlayer(w av.WriteCloser) error {
138138
if c.Closed() {
139139
return ErrClosed
140140
}
141-
c.players.Store(w, newPackWriterCloser(w))
141+
_, loaded := c.players.LoadOrStore(w, newPackWriterCloser(w))
142+
if loaded {
143+
return errors.New("player already exists")
144+
}
142145
return nil
143146
}
144147

@@ -148,7 +151,10 @@ func (c *Channel) DelPlayer(w av.WriteCloser) error {
148151
if c.Closed() {
149152
return ErrClosed
150153
}
151-
c.players.Delete(w)
154+
pw, loaded := c.players.LoadAndDelete(w)
155+
if loaded {
156+
pw.GetWriter().Close()
157+
}
152158
return nil
153159
}
154160

@@ -173,20 +179,38 @@ func (c *Channel) InitHlsPlayer() error {
173179
return ErrClosed
174180
}
175181
c.hlsOnce.Do(func() {
176-
if c.InitdHlsPlayer() {
177-
return
178-
}
179-
w := hls.NewSource()
180-
atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&c.hlsWriter)), unsafe.Pointer(w))
181-
go c.hlsWriter.SendPacket()
182-
if err := c.AddPlayer(c.hlsWriter); err != nil {
183-
c.hlsWriter.Close()
184-
return
185-
}
182+
p := hls.NewSource()
183+
atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&c.hlsWriter)), unsafe.Pointer(p))
184+
go func() {
185+
for {
186+
if c.Closed() {
187+
return
188+
}
189+
if err := c.AddPlayer(p); err != nil {
190+
p.Close()
191+
continue
192+
}
193+
p.SendPacket()
194+
p.Close()
195+
if c.Closed() {
196+
return
197+
}
198+
p = hls.NewSource()
199+
atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&c.hlsWriter)), unsafe.Pointer(p))
200+
}
201+
}()
186202
})
187203
return nil
188204
}
189205

206+
func (c *Channel) HlsPlayer() *hls.Source {
207+
w := atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&c.hlsWriter)))
208+
if w == nil {
209+
return nil
210+
}
211+
return (*hls.Source)(w)
212+
}
213+
190214
func (c *Channel) InitdHlsPlayer() bool {
191215
w := atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&c.hlsWriter)))
192216
return w != nil
@@ -198,14 +222,14 @@ func (c *Channel) GenM3U8PlayList(tsBashPath string) (*bytes.Buffer, error) {
198222
if !c.InitdHlsPlayer() {
199223
return nil, ErrHlsPlayerNotInit
200224
}
201-
return c.hlsWriter.GetCacheInc().GenM3U8PlayList(tsBashPath), nil
225+
return c.HlsPlayer().GetCacheInc().GenM3U8PlayList(tsBashPath), nil
202226
}
203227

204228
func (c *Channel) GetTsFile(tsName string) ([]byte, error) {
205229
if !c.InitdHlsPlayer() {
206230
return nil, ErrHlsPlayerNotInit
207231
}
208-
t, err := c.hlsWriter.GetCacheInc().GetItem(tsName)
232+
t, err := c.HlsPlayer().GetCacheInc().GetItem(tsName)
209233
if err != nil {
210234
return nil, err
211235
}

0 commit comments

Comments
 (0)