diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cd784b..5912160 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ### v1.2.0 > v1.3.0 +- Add low_delay option to processing (default: true) +- Mod uses the ingest stream for publication (datarhei/restreamer#411) - Add dlive & Trovo publication services - Mod optimized DVR on DiskFS - Mod updates packages diff --git a/src/misc/Player/index.js b/src/misc/Player/index.js index c93bd35..5d7e187 100644 --- a/src/misc/Player/index.js +++ b/src/misc/Player/index.js @@ -15,6 +15,9 @@ export default function Player(props) { liveui: true, responsive: true, fluid: true, + plugins: { + reloadSourceOnError: {} + }, sources: [{ src: props.source, type: 'application/x-mpegURL' }], }; diff --git a/src/misc/controls/Process.js b/src/misc/controls/Process.js index 1d37aad..6ed5688 100644 --- a/src/misc/controls/Process.js +++ b/src/misc/controls/Process.js @@ -13,6 +13,7 @@ function init(settings) { reconnect: true, delay: 30, staleTimeout: 30, + low_delay: true, ...settings, }; @@ -31,7 +32,7 @@ export default function Control(props) { const handleChange = (what) => (event) => { const value = event.target.value; - if (['autostart', 'reconnect', 'cleanup'].includes(what)) { + if (['autostart', 'reconnect', 'low_delay'].includes(what)) { settings[what] = !settings[what]; } else { settings[what] = value; @@ -44,6 +45,7 @@ export default function Control(props) { Reconnect} checked={settings.reconnect} onChange={handleChange('reconnect')} /> + Low delay} checked={settings.low_delay} onChange={handleChange('low_delay')} /> o[0] + '=' + o[1]) .join(':'); - output.options.push('-flags', '+global_header', '-tag:v', '7', '-tag:a', '10', '-f', 'tee'); + // set flags + if (control.process.low_delay) { + output.options.push('-flags', '+low_delay+global_header'); + } else { + output.options.push('-flags', '+global_header'); + } + + output.options.push('-tag:v', '7', '-tag:a', '10', '-f', 'tee'); // ['f=hls:start_number=0...]address.m3u8 // use tee_muxer formatting output.address = @@ -1759,6 +1782,11 @@ class Restreamer { // adding the '-' in front of the first option, then flatten everything const hls_params = hls_params_raw.map((o) => ['-' + o[0], o[1]]).reduce((acc, val) => acc.concat(val), []); + // set flags + if (control.process.low_delay) { + output.options.push('-flags', '+low_delay'); + } + output.options.push(...hls_params); } @@ -2552,10 +2580,18 @@ class Restreamer { output.options = []; } + // set flags + let options = []; + if (control.process.low_delay) { + options.push('-flags', '+low_delay'); + } + + options.push(...output.options.map((o) => '' + o)); + config.output.push({ id: 'output_' + i, address: output.address, - options: output.options.map((o) => '' + o), + options: options, }); } diff --git a/src/views/Edit/Sources/Network.js b/src/views/Edit/Sources/Network.js index aa8ecd1..46e52a0 100644 --- a/src/views/Edit/Sources/Network.js +++ b/src/views/Edit/Sources/Network.js @@ -326,13 +326,13 @@ const isSupportedProtocol = (url, supportedProtocols) => { const getHLSAddress = (host, credentials, name, secure) => { // Test for IPv6 addresses and put brackets around - let url = 'http' + (secure ? 's' : '') + '://' + (credentials.length !== 0 ? credentials + '@' : '') + host + '/memfs/ingest/' + name + '.m3u8'; + let url = 'http' + (secure ? 's' : '') + '://' + (credentials.length !== 0 ? credentials + '@' : '') + host + '/memfs/' + name + '.m3u8'; return url; }; const getRTMPAddress = (host, app, name, token, secure) => { - let url = 'rtmp' + (secure ? 's' : '') + '://' + host + app + '/ingest/' + name + '.stream'; + let url = 'rtmp' + (secure ? 's' : '') + '://' + host + app + '/' + name + '.stream'; if (token.length !== 0) { url += '?token=' + encodeURIComponent(token); @@ -348,7 +348,7 @@ const getSRTAddress = (host, name, token, passphrase, publish) => { host + '?mode=caller&transtype=live&streamid=#!:m=' + (publish ? 'publish' : 'request') + - ',r=ingest/' + + ',r=' + name + (token.length !== 0 ? ',token=' + encodeURIComponent(token) : ''); diff --git a/src/views/Edit/Wizard/index.js b/src/views/Edit/Wizard/index.js index ef306fa..71fab1b 100644 --- a/src/views/Edit/Wizard/index.js +++ b/src/views/Edit/Wizard/index.js @@ -436,7 +436,6 @@ export default function Wizard(props) { ); } // STEP 3 - Source Probe - // todo: der step kann durch nen backdrop abgelöst werden. dadurch wirkt es schneller else if ($step === 'VIDEO PROBE') { return ( diff --git a/src/views/Main/Progress.js b/src/views/Main/Progress.js index b69b955..a24307f 100644 --- a/src/views/Main/Progress.js +++ b/src/views/Main/Progress.js @@ -40,10 +40,8 @@ export default function Progress(props) { ...divStyle, }; - if (fps && (fps < 10 || speed < 0.8 || speed > 1.2)) { + if (fps && (fps < 10 || speed < 1.0)) { fpsStyle.backgroundColor = Palette.background.box_danger; - } else if (fps && (speed < 0.9 || speed > 1.1)) { - fpsStyle.backgroundColor = Palette.service.main; } else { fpsStyle.backgroundColor = Palette.background.box_default; } diff --git a/src/views/Publication/Services/Core.js b/src/views/Publication/Services/Core.js index 8d5d8e9..6aa2ce9 100644 --- a/src/views/Publication/Services/Core.js +++ b/src/views/Publication/Services/Core.js @@ -131,7 +131,7 @@ function Service(props) { label={Stream name} value={settings.stream_name} onChange={handleChange('stream_name')} - placeholder={settings.protocol !== 'srt' ? 'streamId' : 'ingest/streamId'} + placeholder={'streamId'} />