hls client: do not create audio track when there's no audio track

This commit is contained in:
aler9 2022-03-20 16:55:53 +01:00
parent 99f3215cfe
commit 56338e0084
5 changed files with 28 additions and 24 deletions

View File

@ -103,7 +103,7 @@ func (s *hlsSource) runInner() bool {
}
}()
onTracks := func(videoTrack gortsplib.Track, audioTrack gortsplib.Track) error {
onTracks := func(videoTrack *gortsplib.TrackH264, audioTrack *gortsplib.TrackAAC) error {
var tracks gortsplib.Tracks
if videoTrack != nil {

View File

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

View File

@ -16,7 +16,7 @@ type clientAudioProcessorData struct {
type clientAudioProcessor struct {
ctx context.Context
onTrack func(gortsplib.Track) error
onTrack func(*gortsplib.TrackAAC) error
onData func(time.Duration, [][]byte)
trackInitialized bool
@ -26,7 +26,7 @@ type clientAudioProcessor struct {
func newClientAudioProcessor(
ctx context.Context,
onTrack func(gortsplib.Track) error,
onTrack func(*gortsplib.TrackAAC) error,
onData func(time.Duration, [][]byte),
) *clientAudioProcessor {
p := &clientAudioProcessor{

View File

@ -214,7 +214,7 @@ func TestClient(t *testing.T) {
c, err := NewClient(
prefix+"://localhost:5780/stream.m3u8",
"33949E05FFFB5FF3E8AA16F8213A6251B4D9363804BA53233C4DA9A46D6F2739",
func(gortsplib.Track, gortsplib.Track) error {
func(*gortsplib.TrackH264, *gortsplib.TrackAAC) error {
return nil
},
func(pts time.Duration, nalus [][]byte) {

View File

@ -19,7 +19,7 @@ type clientVideoProcessorData struct {
type clientVideoProcessor struct {
ctx context.Context
onTrack func(gortsplib.Track) error
onTrack func(*gortsplib.TrackH264) error
onData func(time.Duration, [][]byte)
logger ClientLogger
@ -32,7 +32,7 @@ type clientVideoProcessor struct {
func newClientVideoProcessor(
ctx context.Context,
onTrack func(gortsplib.Track) error,
onTrack func(*gortsplib.TrackH264) error,
onData func(time.Duration, [][]byte),
logger ClientLogger,
) *clientVideoProcessor {