From d9b7878c3dfa0e043b70ecae3d33a9d938555f94 Mon Sep 17 00:00:00 2001 From: Alessandro Ros Date: Sun, 6 Aug 2023 13:21:32 +0200 Subject: [PATCH] hls: prefer Opus tracks to MPEG-4 tracks (#2158) --- internal/core/hls_muxer.go | 74 +++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/internal/core/hls_muxer.go b/internal/core/hls_muxer.go index 22fe7911..fe59dab1 100644 --- a/internal/core/hls_muxer.go +++ b/internal/core/hls_muxer.go @@ -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 } 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 }) 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 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 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 } 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 }) 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, }, } }