diff --git a/README.md b/README.md index 40410f40..4244834d 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,10 @@ For n.eko room management software visit https://github.com/m1k1o/neko-rooms. - Added `m1k1o/neko:vncviewer` tag, use `NEKO_VNC_URL` to specify VNC target and use n.eko as a bridge. - Abiltiy to include neko as a component in another Vue.Js project (by @gbrian). - Added HEALTHCHECK to Dockerfile. +- Arguments in broadcast pipeline are optional, not positional and can be repeated `{url} {device} {display}`. + +### Roadmap & TODOs +- Catch errors from gst pipeline, tell user if broadcast failed. # Getting started & FAQ diff --git a/server/internal/gst/gst.go b/server/internal/gst/gst.go index df052fa0..42a0d1e4 100644 --- a/server/internal/gst/gst.go +++ b/server/internal/gst/gst.go @@ -9,6 +9,7 @@ package gst import "C" import ( "fmt" + "strings" "sync" "time" "unsafe" @@ -66,7 +67,12 @@ func CreateRTMPPipeline(pipelineDevice string, pipelineDisplay string, pipelineS var pipelineStr string if pipelineSrc != "" { - pipelineStr = fmt.Sprintf(pipelineSrc, pipelineRTMP, pipelineDevice, pipelineDisplay) + // replace RTMP url + pipelineStr = strings.Replace(pipelineSrc, "{url}", pipelineRTMP, -1) + // replace audio device + pipelineStr = strings.Replace(pipelineStr, "{device}", pipelineDevice, -1) + // replace display + pipelineStr = strings.Replace(pipelineStr, "{display}", pipelineDisplay, -1) } else { pipelineStr = fmt.Sprintf("flvmux name=mux ! rtmpsink location='%s live=1' %s audio/x-raw,channels=2 ! audioconvert ! voaacenc ! mux. %s x264enc bframes=0 key-int-max=60 byte-stream=true tune=zerolatency speed-preset=veryfast ! mux.", pipelineRTMP, audio, video) } diff --git a/server/internal/types/config/broadcast.go b/server/internal/types/config/broadcast.go index 22ef94ac..53cef499 100644 --- a/server/internal/types/config/broadcast.go +++ b/server/internal/types/config/broadcast.go @@ -10,7 +10,7 @@ type Broadcast struct { } func (Broadcast) Init(cmd *cobra.Command) error { - cmd.PersistentFlags().String("broadcast_pipeline", "", "audio codec parameters to use for broadcasting") + cmd.PersistentFlags().String("broadcast_pipeline", "", "custom gst pipeline used for broadcasting, strings {url} {device} {display} will be replaced") if err := viper.BindPFlag("broadcast_pipeline", cmd.PersistentFlags().Lookup("broadcast_pipeline")); err != nil { return err }