mirror of
https://github.com/aler9/rtsp-simple-server
synced 2025-10-14 19:57:31 +08:00
hls client: do not create audio track when there's no audio track
This commit is contained in:
@@ -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 {
|
||||||
|
@@ -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)
|
||||||
|
}
|
||||||
|
@@ -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{
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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 {
|
||||||
|
Reference in New Issue
Block a user