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 var tracks gortsplib.Tracks
if videoTrack != nil { if videoTrack != nil {

View File

@@ -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)
}

View File

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

View File

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

View File

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