From d02617329bdf4384f6fbebba517302229568c47a Mon Sep 17 00:00:00 2001 From: m1k1o Date: Sun, 27 Sep 2020 12:09:45 +0200 Subject: [PATCH] custom RTMP pipeline --- server/internal/broadcast/manager.go | 1 + server/internal/gst/gst.go | 11 ++++++++-- server/internal/types/config/broadcast.go | 26 ++++++----------------- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/server/internal/broadcast/manager.go b/server/internal/broadcast/manager.go index bca83cf7..d6ebbe0b 100644 --- a/server/internal/broadcast/manager.go +++ b/server/internal/broadcast/manager.go @@ -36,6 +36,7 @@ func (manager *BroadcastManager) Start() { manager.pipeline, err = gst.CreateRTMPPipeline( manager.remote.Device, manager.remote.Display, + manager.config.Pipeline, manager.url, ) diff --git a/server/internal/gst/gst.go b/server/internal/gst/gst.go index e2679de5..58446096 100644 --- a/server/internal/gst/gst.go +++ b/server/internal/gst/gst.go @@ -65,11 +65,18 @@ func init() { } // CreateRTMPPipeline creates a GStreamer Pipeline -func CreateRTMPPipeline(pipelineDevice string, pipelineDisplay string, pipelineRTMP string) (*Pipeline, error) { +func CreateRTMPPipeline(pipelineDevice string, pipelineDisplay string, pipelineSrc string, pipelineRTMP string) (*Pipeline, error) { video := fmt.Sprintf(videoSrc, pipelineDisplay) audio := fmt.Sprintf(audioSrc, pipelineDevice) - return CreatePipeline(fmt.Sprintf("flvmux name=mux ! rtmpsink location='%s live=1' %s voaacenc ! mux. %s x264enc bframes=0 key-int-max=60 byte-stream=true tune=zerolatency speed-preset=veryfast ! mux.", pipelineRTMP, audio, video), "", 0) + var pipelineStr string + if pipelineSrc != "" { + pipelineStr = fmt.Sprintf(pipelineSrc, pipelineRTMP, pipelineDevice, pipelineDisplay) + } else { + pipelineStr = fmt.Sprintf("flvmux name=mux ! rtmpsink location='%s live=1' %s ! voaacenc ! mux. %s x264enc bframes=0 key-int-max=60 byte-stream=true tune=zerolatency speed-preset=veryfast ! mux.", pipelineRTMP, audio, video) + } + + return CreatePipeline(pipelineStr, "", 0) } // CreateAppPipeline creates a GStreamer Pipeline diff --git a/server/internal/types/config/broadcast.go b/server/internal/types/config/broadcast.go index f9284486..22ef94ac 100644 --- a/server/internal/types/config/broadcast.go +++ b/server/internal/types/config/broadcast.go @@ -6,32 +6,18 @@ import ( ) type Broadcast struct { - // Enabled bool - // AudioParams string - // VideoParams string + Pipeline string } func (Broadcast) Init(cmd *cobra.Command) error { - // cmd.PersistentFlags().Bool("broadcast", false, "enable boradcasting") - // if err := viper.BindPFlag("broadcast", cmd.PersistentFlags().Lookup("broadcast")); err != nil { - // return err - // } - - // cmd.PersistentFlags().String("cast_audio", "", "audio codec parameters to use for broadcasting") - // if err := viper.BindPFlag("cast_audio", cmd.PersistentFlags().Lookup("cast_audio")); err != nil { - // return err - // } - - // cmd.PersistentFlags().String("cast_video", "", "video codec parameters to use for broadcasting") - // if err := viper.BindPFlag("cast_video", cmd.PersistentFlags().Lookup("cast_video")); err != nil { - // return err - // } + cmd.PersistentFlags().String("broadcast_pipeline", "", "audio codec parameters to use for broadcasting") + if err := viper.BindPFlag("broadcast_pipeline", cmd.PersistentFlags().Lookup("broadcast_pipeline")); err != nil { + return err + } return nil } func (s *Broadcast) Set() { - // s.Enabled = viper.GetBool("broadcast") - // s.AudioParams = viper.GetString("cast_audio") - // s.VideoParams = viper.GetString("cast_video") + s.Pipeline = viper.GetString("broadcast_pipeline") }