Browse Source

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

pull/909/head
aler9 4 years ago
parent
commit
56338e0084
  1. 2
      internal/core/hls_source.go
  2. 40
      internal/hls/client.go
  3. 4
      internal/hls/client_audio_processor.go
  4. 2
      internal/hls/client_test.go
  5. 4
      internal/hls/client_video_processor.go

2
internal/core/hls_source.go

@ -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 {

40
internal/hls/client.go

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

4
internal/hls/client_audio_processor.go

@ -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{

2
internal/hls/client_test.go

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

4
internal/hls/client_video_processor.go

@ -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 {

Loading…
Cancel
Save