|
|
|
@ -46,7 +46,7 @@ type ClientLogger interface { |
|
|
|
|
|
|
|
|
|
|
|
// Client is a HLS client.
|
|
|
|
// Client is a HLS client.
|
|
|
|
type Client struct { |
|
|
|
type Client struct { |
|
|
|
onTracks func(gortsplib.Track, gortsplib.Track) error |
|
|
|
onTracks func(*gortsplib.TrackH264, *gortsplib.TrackAAC) error |
|
|
|
onVideoData func(time.Duration, [][]byte) |
|
|
|
onVideoData func(time.Duration, [][]byte) |
|
|
|
onAudioData func(time.Duration, [][]byte) |
|
|
|
onAudioData func(time.Duration, [][]byte) |
|
|
|
logger ClientLogger |
|
|
|
logger ClientLogger |
|
|
|
@ -69,8 +69,8 @@ type Client struct { |
|
|
|
audioProc *clientAudioProcessor |
|
|
|
audioProc *clientAudioProcessor |
|
|
|
|
|
|
|
|
|
|
|
tracksMutex sync.RWMutex |
|
|
|
tracksMutex sync.RWMutex |
|
|
|
videoTrack gortsplib.Track |
|
|
|
videoTrack *gortsplib.TrackH264 |
|
|
|
audioTrack gortsplib.Track |
|
|
|
audioTrack *gortsplib.TrackAAC |
|
|
|
|
|
|
|
|
|
|
|
// in
|
|
|
|
// in
|
|
|
|
allocateProcs chan clientAllocateProcsReq |
|
|
|
allocateProcs chan clientAllocateProcsReq |
|
|
|
@ -83,7 +83,7 @@ type Client struct { |
|
|
|
func NewClient( |
|
|
|
func NewClient( |
|
|
|
primaryPlaylistURLStr string, |
|
|
|
primaryPlaylistURLStr string, |
|
|
|
fingerprint string, |
|
|
|
fingerprint string, |
|
|
|
onTracks func(gortsplib.Track, gortsplib.Track) error, |
|
|
|
onTracks func(*gortsplib.TrackH264, *gortsplib.TrackAAC) error, |
|
|
|
onVideoData func(time.Duration, [][]byte), |
|
|
|
onVideoData func(time.Duration, [][]byte), |
|
|
|
onAudioData func(time.Duration, [][]byte), |
|
|
|
onAudioData func(time.Duration, [][]byte), |
|
|
|
logger ClientLogger, |
|
|
|
logger ClientLogger, |
|
|
|
@ -167,12 +167,8 @@ func (c *Client) runInner() error { |
|
|
|
if c.videoPID != nil { |
|
|
|
if c.videoPID != nil { |
|
|
|
c.videoProc = newClientVideoProcessor( |
|
|
|
c.videoProc = newClientVideoProcessor( |
|
|
|
innerCtx, |
|
|
|
innerCtx, |
|
|
|
c.onVideoTrack, |
|
|
|
c.onVideoProcessorTrack, |
|
|
|
func(pts time.Duration, nalus [][]byte) { |
|
|
|
c.onVideoProcessorData, |
|
|
|
c.tracksMutex.RLock() |
|
|
|
|
|
|
|
defer c.tracksMutex.RUnlock() |
|
|
|
|
|
|
|
c.onVideoData(pts, nalus) |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
c.logger) |
|
|
|
c.logger) |
|
|
|
|
|
|
|
|
|
|
|
go func() { errChan <- c.videoProc.run() }() |
|
|
|
go func() { errChan <- c.videoProc.run() }() |
|
|
|
@ -181,12 +177,8 @@ func (c *Client) runInner() error { |
|
|
|
if c.audioPID != nil { |
|
|
|
if c.audioPID != nil { |
|
|
|
c.audioProc = newClientAudioProcessor( |
|
|
|
c.audioProc = newClientAudioProcessor( |
|
|
|
innerCtx, |
|
|
|
innerCtx, |
|
|
|
c.onAudioTrack, |
|
|
|
c.onAudioProcessorTrack, |
|
|
|
func(pts time.Duration, aus [][]byte) { |
|
|
|
c.onAudioProcessorData) |
|
|
|
c.tracksMutex.RLock() |
|
|
|
|
|
|
|
defer c.tracksMutex.RUnlock() |
|
|
|
|
|
|
|
c.onAudioData(pts, aus) |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
go func() { errChan <- c.audioProc.run() }() |
|
|
|
go func() { errChan <- c.audioProc.run() }() |
|
|
|
} |
|
|
|
} |
|
|
|
@ -525,7 +517,7 @@ func (c *Client) processSegment(innerCtx context.Context, byts []byte) error { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (c *Client) onVideoTrack(track gortsplib.Track) error { |
|
|
|
func (c *Client) onVideoProcessorTrack(track *gortsplib.TrackH264) error { |
|
|
|
c.tracksMutex.Lock() |
|
|
|
c.tracksMutex.Lock() |
|
|
|
defer c.tracksMutex.Unlock() |
|
|
|
defer c.tracksMutex.Unlock() |
|
|
|
|
|
|
|
|
|
|
|
@ -538,7 +530,13 @@ func (c *Client) onVideoTrack(track gortsplib.Track) error { |
|
|
|
return nil |
|
|
|
return nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (c *Client) onAudioTrack(track gortsplib.Track) error { |
|
|
|
func (c *Client) onVideoProcessorData(pts time.Duration, nalus [][]byte) { |
|
|
|
|
|
|
|
c.tracksMutex.RLock() |
|
|
|
|
|
|
|
defer c.tracksMutex.RUnlock() |
|
|
|
|
|
|
|
c.onVideoData(pts, nalus) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (c *Client) onAudioProcessorTrack(track *gortsplib.TrackAAC) error { |
|
|
|
c.tracksMutex.Lock() |
|
|
|
c.tracksMutex.Lock() |
|
|
|
defer c.tracksMutex.Unlock() |
|
|
|
defer c.tracksMutex.Unlock() |
|
|
|
|
|
|
|
|
|
|
|
@ -550,3 +548,9 @@ func (c *Client) onAudioTrack(track gortsplib.Track) error { |
|
|
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
return nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (c *Client) onAudioProcessorData(pts time.Duration, aus [][]byte) { |
|
|
|
|
|
|
|
c.tracksMutex.RLock() |
|
|
|
|
|
|
|
defer c.tracksMutex.RUnlock() |
|
|
|
|
|
|
|
c.onAudioData(pts, aus) |
|
|
|
|
|
|
|
} |
|
|
|
|