From 3d8ba0623db039475d7aed5a763aed9b4189362c Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Mon, 9 Nov 2020 17:18:37 +0100 Subject: [PATCH] Use config file for OME broadcasting --- docs/Server-docker.xml | 2 +- docs/docker-compose.yml | 4 ++-- docs/ghostream.example.yml | 14 +++++++++++++- internal/config/config.go | 7 +++++++ main.go | 4 +++- stream/ovenmediaengine/ovenmediaengine.go | 17 +++++++++++++++++ web/handler.go | 3 ++- web/static/js/ovenplayer.js | 7 ++++--- web/template/player.html | 2 +- web/web.go | 6 +++++- 10 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 stream/ovenmediaengine/ovenmediaengine.go diff --git a/docs/Server-docker.xml b/docs/Server-docker.xml index e31acf2..5d8fb15 100644 --- a/docs/Server-docker.xml +++ b/docs/Server-docker.xml @@ -36,7 +36,7 @@ - app + play live diff --git a/docs/docker-compose.yml b/docs/docker-compose.yml index 990045c..4f4e555 100644 --- a/docs/docker-compose.yml +++ b/docs/docker-compose.yml @@ -51,7 +51,7 @@ services: labels: - "traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https" - - "traefik.http.routers.ovenmediaengine.rule=Host(`stream.example.com`) && PathPrefix(`/app/`)" + - "traefik.http.routers.ovenmediaengine.rule=Host(`stream.example.com`) && PathPrefix(`/play/`)" - "traefik.http.routers.ovenmediaengine.priority=101" - "traefik.http.routers.ovenmediaengine.entrypoints=websecure" - "traefik.http.routers.ovenmediaengine.tls.certresolver=mytlschallenge" @@ -59,7 +59,7 @@ services: - "traefik.http.routers.ovenmediaengine.service=ovenmediaengine" - "traefik.http.routers.ovenmediaengine.middlewares=sslheader" - - "traefik.http.routers.ovenmediaengine-hls.rule=Host(`stream.example.com`) && Path(`/app/{app_name:.*}/{filename:.*}.{ext:(m3u8|mpd|ts)}`)" + - "traefik.http.routers.ovenmediaengine-hls.rule=Host(`stream.example.com`) && Path(`/play/{app_name:.*}/{filename:.*}.{ext:(m3u8|mpd|ts)}`)" - "traefik.http.routers.ovenmediaengine-hls.priority=102" - "traefik.http.routers.ovenmediaengine-hls.entrypoints=websecure" - "traefik.http.routers.ovenmediaengine-hls.tls.certresolver=mytlschallenge" diff --git a/docs/ghostream.example.yml b/docs/ghostream.example.yml index a011289..148f89b 100644 --- a/docs/ghostream.example.yml +++ b/docs/ghostream.example.yml @@ -49,7 +49,6 @@ forwarding: # - rtmp://live-cdg.twitch.tv/app/STREAM_KEY # - rtmp://a.rtmp.youtube.com/live2/STREAM_KEY # - /home/ghostream/lives/%name/live-%Y-%m-%d-%H-%M-%S.flv - # - rtmp://ovenmediaengine:1915/app/demo # For player ## Prometheus monitoring ## # Expose a monitoring endpoint for Prometheus @@ -62,6 +61,19 @@ monitoring: # To limit access to only localhost, use 127.0.0.1:2112 #listenAddress: :2112 +## OvenMediaEngine ## +# Send the stream data to OvenMediaEngine to handle properly the web client +ome: + # If you disable OME module, the laggy webrtc client will be used. + # + #enabled: true + # + # The URL where OME listens RTMP, without the prefix. + #url: ovenmediaengine:1915 + # + # The OME app where OME is waiting for the data of Ghostream. + #app: play + ## SRT server ## # The SRT server receive incoming stream and can also serve video to clients. srt: diff --git a/internal/config/config.go b/internal/config/config.go index af0c042..fee41a7 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -2,6 +2,7 @@ package config import ( + "gitlab.crans.org/nounous/ghostream/stream/ovenmediaengine" "net" "github.com/sherifabdlnaby/configuro" @@ -23,6 +24,7 @@ type Config struct { Auth auth.Options Forwarding forwarding.Options Monitoring monitoring.Options + OME ovenmediaengine.Options Srt srt.Options Telnet telnet.Options Transcoder transcoder.Options @@ -49,6 +51,11 @@ func New() *Config { Enabled: true, ListenAddress: ":2112", }, + OME: ovenmediaengine.Options{ + Enabled: true, + URL: "ovenmediaengine:1915", + App: "play", + }, Srt: srt.Options{ Enabled: true, ListenAddress: ":9710", diff --git a/main.go b/main.go index c984279..50ecce8 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ package main import ( + "gitlab.crans.org/nounous/ghostream/stream/ovenmediaengine" "log" "github.com/pkg/profile" @@ -49,9 +50,10 @@ func main() { go transcoder.Init(streams, &cfg.Transcoder) go forwarding.Serve(streams, cfg.Forwarding) go monitoring.Serve(&cfg.Monitoring) + go ovenmediaengine.Serve(streams, &cfg.OME) go srt.Serve(streams, authBackend, &cfg.Srt) go telnet.Serve(streams, &cfg.Telnet) - go web.Serve(streams, &cfg.Web) + go web.Serve(streams, &cfg.Web, &cfg.OME) go webrtc.Serve(streams, &cfg.WebRTC) // Wait for routines diff --git a/stream/ovenmediaengine/ovenmediaengine.go b/stream/ovenmediaengine/ovenmediaengine.go new file mode 100644 index 0000000..a1fde3c --- /dev/null +++ b/stream/ovenmediaengine/ovenmediaengine.go @@ -0,0 +1,17 @@ +// Package ovenmediaengine provides the forwarding to an ovenmediaengine server to handle the web client +package ovenmediaengine + +import "gitlab.crans.org/nounous/ghostream/messaging" + +// Options holds ovenmediaengine package configuration +type Options struct { + Enabled bool + URL string + App string +} + +func Serve(streams *messaging.Streams, cfg *Options) { + if !cfg.Enabled { + return + } +} diff --git a/web/handler.go b/web/handler.go index a17191d..0cb527e 100644 --- a/web/handler.go +++ b/web/handler.go @@ -61,7 +61,8 @@ func viewerHandler(w http.ResponseWriter, r *http.Request) { Cfg *Options Path string WidgetURL string - }{Path: path, Cfg: cfg, WidgetURL: ""} + OMEApp string + }{Path: path, Cfg: cfg, WidgetURL: "", OMEApp: omeCfg.App} // Load widget is user does not disable it with ?nowidget if _, ok := r.URL.Query()["nowidget"]; !ok { diff --git a/web/static/js/ovenplayer.js b/web/static/js/ovenplayer.js index b9af961..0a8da4e 100644 --- a/web/static/js/ovenplayer.js +++ b/web/static/js/ovenplayer.js @@ -4,10 +4,11 @@ import { ViewerCounter } from "./modules/viewerCounter.js"; * Initialize viewer page * * @param {String} stream + * @param {String} omeApp * @param {Number} viewersCounterRefreshPeriod * @param {String} posterUrl */ -export function initViewerPage(stream, viewersCounterRefreshPeriod, posterUrl) { +export function initViewerPage(stream, omeApp, viewersCounterRefreshPeriod, posterUrl) { // Create viewer counter const viewerCounter = new ViewerCounter( document.getElementById("connected-people"), @@ -41,13 +42,13 @@ export function initViewerPage(stream, viewersCounterRefreshPeriod, posterUrl) { expandFullScreenUI: true, sources: [ { - "file": "wss://" + window.location.host + "/app/" + stream, + "file": "wss://" + window.location.host + "/" + omeApp + "/" + stream, "type": "webrtc", "label": " WebRTC - Source" }, { "type": "hls", - "file": "https://" + window.location.host + "/app/" + stream + "_bypass/playlist.m3u8", + "file": "https://" + window.location.host + "/" + omeApp + "/" + stream + "_bypass/playlist.m3u8", "label": " HLS" } ] diff --git a/web/template/player.html b/web/template/player.html index 8e7b145..118ee4b 100644 --- a/web/template/player.html +++ b/web/template/player.html @@ -50,6 +50,6 @@ "{{$value}}", {{end}} ] - initViewerPage(stream, /*stunServers,*/ viewersCounterRefreshPeriod, {{.Cfg.PlayerPoster}}) + initViewerPage(stream, {{.OMEApp}}, /*stunServers,*/ viewersCounterRefreshPeriod, {{.Cfg.PlayerPoster}}) {{end}} diff --git a/web/web.go b/web/web.go index 44dc90e..8f29851 100644 --- a/web/web.go +++ b/web/web.go @@ -2,6 +2,7 @@ package web import ( + "gitlab.crans.org/nounous/ghostream/stream/ovenmediaengine" "html/template" "io/ioutil" "log" @@ -32,6 +33,8 @@ type Options struct { var ( cfg *Options + omeCfg *ovenmediaengine.Options + // Preload templates templates *template.Template @@ -70,9 +73,10 @@ func loadTemplates() error { } // Serve HTTP server -func Serve(s *messaging.Streams, c *Options) { +func Serve(s *messaging.Streams, c *Options, ome *ovenmediaengine.Options) { streams = s cfg = c + omeCfg = ome if !cfg.Enabled { // Web server is not enabled, ignore