|
|
|
|
@ -456,20 +456,16 @@ func (m *hlsMuxer) createVideoTrack(stream *stream.Stream) (*media.Media, *gohls
@@ -456,20 +456,16 @@ func (m *hlsMuxer) createVideoTrack(stream *stream.Stream) (*media.Media, *gohls
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohlslib.Track) { |
|
|
|
|
var audioFormatMPEG4AudioGeneric *formats.MPEG4AudioGeneric |
|
|
|
|
audioMedia := stream.Medias().FindFormat(&audioFormatMPEG4AudioGeneric) |
|
|
|
|
var audioFormatOpus *formats.Opus |
|
|
|
|
audioMedia := stream.Medias().FindFormat(&audioFormatOpus) |
|
|
|
|
|
|
|
|
|
if audioMedia != nil { |
|
|
|
|
audioStartPTSFilled := false |
|
|
|
|
var audioStartPTS time.Duration |
|
|
|
|
|
|
|
|
|
stream.AddReader(m, audioMedia, audioFormatMPEG4AudioGeneric, func(unit formatprocessor.Unit) { |
|
|
|
|
stream.AddReader(m, audioMedia, audioFormatOpus, func(unit formatprocessor.Unit) { |
|
|
|
|
m.ringBuffer.Push(func() error { |
|
|
|
|
tunit := unit.(*formatprocessor.UnitMPEG4AudioGeneric) |
|
|
|
|
|
|
|
|
|
if tunit.AUs == nil { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
tunit := unit.(*formatprocessor.UnitOpus) |
|
|
|
|
|
|
|
|
|
if !audioStartPTSFilled { |
|
|
|
|
audioStartPTSFilled = true |
|
|
|
|
@ -477,10 +473,10 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
@@ -477,10 +473,10 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pts := tunit.PTS - audioStartPTS |
|
|
|
|
err := m.muxer.WriteMPEG4Audio( |
|
|
|
|
err := m.muxer.WriteOpus( |
|
|
|
|
tunit.NTP, |
|
|
|
|
pts, |
|
|
|
|
tunit.AUs) |
|
|
|
|
tunit.Packets) |
|
|
|
|
if err != nil { |
|
|
|
|
return fmt.Errorf("muxer error: %v", err) |
|
|
|
|
} |
|
|
|
|
@ -490,27 +486,29 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
@@ -490,27 +486,29 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
return audioMedia, &gohlslib.Track{ |
|
|
|
|
Codec: &codecs.MPEG4Audio{ |
|
|
|
|
Config: *audioFormatMPEG4AudioGeneric.Config, |
|
|
|
|
Codec: &codecs.Opus{ |
|
|
|
|
ChannelCount: func() int { |
|
|
|
|
if audioFormatOpus.IsStereo { |
|
|
|
|
return 2 |
|
|
|
|
} |
|
|
|
|
return 1 |
|
|
|
|
}(), |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var audioFormatMPEG4AudioLATM *formats.MPEG4AudioLATM |
|
|
|
|
audioMedia = stream.Medias().FindFormat(&audioFormatMPEG4AudioLATM) |
|
|
|
|
var audioFormatMPEG4AudioGeneric *formats.MPEG4AudioGeneric |
|
|
|
|
audioMedia = stream.Medias().FindFormat(&audioFormatMPEG4AudioGeneric) |
|
|
|
|
|
|
|
|
|
if audioMedia != nil && |
|
|
|
|
audioFormatMPEG4AudioLATM.Config != nil && |
|
|
|
|
len(audioFormatMPEG4AudioLATM.Config.Programs) == 1 && |
|
|
|
|
len(audioFormatMPEG4AudioLATM.Config.Programs[0].Layers) == 1 { |
|
|
|
|
if audioMedia != nil { |
|
|
|
|
audioStartPTSFilled := false |
|
|
|
|
var audioStartPTS time.Duration |
|
|
|
|
|
|
|
|
|
stream.AddReader(m, audioMedia, audioFormatMPEG4AudioLATM, func(unit formatprocessor.Unit) { |
|
|
|
|
stream.AddReader(m, audioMedia, audioFormatMPEG4AudioGeneric, func(unit formatprocessor.Unit) { |
|
|
|
|
m.ringBuffer.Push(func() error { |
|
|
|
|
tunit := unit.(*formatprocessor.UnitMPEG4AudioLATM) |
|
|
|
|
tunit := unit.(*formatprocessor.UnitMPEG4AudioGeneric) |
|
|
|
|
|
|
|
|
|
if tunit.AU == nil { |
|
|
|
|
if tunit.AUs == nil { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -523,7 +521,7 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
@@ -523,7 +521,7 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
|
|
|
|
|
err := m.muxer.WriteMPEG4Audio( |
|
|
|
|
tunit.NTP, |
|
|
|
|
pts, |
|
|
|
|
[][]byte{tunit.AU}) |
|
|
|
|
tunit.AUs) |
|
|
|
|
if err != nil { |
|
|
|
|
return fmt.Errorf("muxer error: %v", err) |
|
|
|
|
} |
|
|
|
|
@ -534,21 +532,28 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
@@ -534,21 +532,28 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
|
|
|
|
|
|
|
|
|
|
return audioMedia, &gohlslib.Track{ |
|
|
|
|
Codec: &codecs.MPEG4Audio{ |
|
|
|
|
Config: *audioFormatMPEG4AudioLATM.Config.Programs[0].Layers[0].AudioSpecificConfig, |
|
|
|
|
Config: *audioFormatMPEG4AudioGeneric.Config, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var audioFormatOpus *formats.Opus |
|
|
|
|
audioMedia = stream.Medias().FindFormat(&audioFormatOpus) |
|
|
|
|
var audioFormatMPEG4AudioLATM *formats.MPEG4AudioLATM |
|
|
|
|
audioMedia = stream.Medias().FindFormat(&audioFormatMPEG4AudioLATM) |
|
|
|
|
|
|
|
|
|
if audioMedia != nil { |
|
|
|
|
if audioMedia != nil && |
|
|
|
|
audioFormatMPEG4AudioLATM.Config != nil && |
|
|
|
|
len(audioFormatMPEG4AudioLATM.Config.Programs) == 1 && |
|
|
|
|
len(audioFormatMPEG4AudioLATM.Config.Programs[0].Layers) == 1 { |
|
|
|
|
audioStartPTSFilled := false |
|
|
|
|
var audioStartPTS time.Duration |
|
|
|
|
|
|
|
|
|
stream.AddReader(m, audioMedia, audioFormatOpus, func(unit formatprocessor.Unit) { |
|
|
|
|
stream.AddReader(m, audioMedia, audioFormatMPEG4AudioLATM, func(unit formatprocessor.Unit) { |
|
|
|
|
m.ringBuffer.Push(func() error { |
|
|
|
|
tunit := unit.(*formatprocessor.UnitOpus) |
|
|
|
|
tunit := unit.(*formatprocessor.UnitMPEG4AudioLATM) |
|
|
|
|
|
|
|
|
|
if tunit.AU == nil { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !audioStartPTSFilled { |
|
|
|
|
audioStartPTSFilled = true |
|
|
|
|
@ -556,10 +561,10 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
@@ -556,10 +561,10 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pts := tunit.PTS - audioStartPTS |
|
|
|
|
err := m.muxer.WriteOpus( |
|
|
|
|
err := m.muxer.WriteMPEG4Audio( |
|
|
|
|
tunit.NTP, |
|
|
|
|
pts, |
|
|
|
|
tunit.Packets) |
|
|
|
|
[][]byte{tunit.AU}) |
|
|
|
|
if err != nil { |
|
|
|
|
return fmt.Errorf("muxer error: %v", err) |
|
|
|
|
} |
|
|
|
|
@ -569,13 +574,8 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
@@ -569,13 +574,8 @@ func (m *hlsMuxer) createAudioTrack(stream *stream.Stream) (*media.Media, *gohls
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
return audioMedia, &gohlslib.Track{ |
|
|
|
|
Codec: &codecs.Opus{ |
|
|
|
|
ChannelCount: func() int { |
|
|
|
|
if audioFormatOpus.IsStereo { |
|
|
|
|
return 2 |
|
|
|
|
} |
|
|
|
|
return 1 |
|
|
|
|
}(), |
|
|
|
|
Codec: &codecs.MPEG4Audio{ |
|
|
|
|
Config: *audioFormatMPEG4AudioLATM.Config.Programs[0].Layers[0].AudioSpecificConfig, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|