Larix Grove: propagate Larix setup easily
Use QR code or deep link to share settings to multiple devices of your contributors
You have a crowd of streaming devices with Larix Broadcaster - correspondents, streamers and other contributors - and you need to distribute links among them in some easy way.
You can distribute streaming settings using easy Larix Grove format for URL-based settings.
- Describe settings. You create URL which consists of larix://set/ prefix and an array of URL parameters, each containing specific value.
URL contains settings for connections and an encoder.
You can also create a QR code for URL. - Distribute. You propagate this URL or QR code via any medium like web page or messenger.
- Import. First option is deep linking: when you tap on larix:// URL on Android or iOS, Larix Broadcaster is launched.
Then you can use Import Grove setting menu item from the app Setting / Connections menu
You may also scan a QR code made with this URL. On iOS it's done by default camera, on Android you can use a QR code scanner of your choice like QR Droid.
Larix Broadcaster appends new connections into its list and also applies encoder settings upon user approval. - Export. All connections and important settings can be exported into Grove format as deep links and QR codes for further import into other apps and devices.
Larix Grove is supported in Larix Broadcaster for both Android and iOS.
Take a look at the example of Grove usage in Livescale setup article, they use it to propagate streaming settings to customers.
Take a look at a demo video to see examples of a web link and a QR code processing.
A few notes:
- The only required parameter is url so Larix would know where to stream.
- There may be multiple conn elements describing connections, all elements are grouped by url parameters.
- If some of conn parameters is not specified, then Larix uses default value - which you see if you add it manually.
- If some enc (encoder) parameter is not specified, then Larix uses the value currently defined in the app Video and Audio settings.
larix://set/v1/
is the beginning of Grove URL?conn[][url]=rtmps://url.to/app/stream
is the URL for a connection. Refer to docs reference for more about publishing, some examples are also provided below.&conn[][name]=Channel%20name
is the name which will be used in connections list in your app.&conn[][overwrite]=on
defines if a connection with this name must be overwritten. on = overwrite, off = do not overwrite (default)&conn[][active]=off
defines if a connection will be marked active when imported into Larix. on = will be checked (default), off = will not be checked&conn[][user]=foo
is a user name for RTMP and RTSP if you want to use authorization.&conn[][pass]=bar
is a password for RTMP and RTSP if you want to use authorization.&conn[][mode]=va
is content mode, "va" stands for "Video+audio", "a" is for "Audio only", "v" is for "Video only".&conn[][target]=rtmp
is a Target type. d="Default", rtmp="RTMP authentication", aka="Akamai/Dacast", lime="Limelight", peri="Periscope".&conn[][token]
is a WHIP RFC6750 bearer token for WebRTC connection.&conn[][url]=srt://url.to:port/
is another connection URL.&conn[][name]=My%20Channel%202
is a connection name.&conn[][srtmode]=c
is SRT mode: "c" for Caller (Push), "l" for Listener, "r" for Rendezvous.&conn[][srtlatency]=1000
is SRT latency field for SRT connection.&conn[][srtmaxbw]=125000
is SRT maxbw field for SRT connection.&conn[][srtpass]=passphrase
is SRT passphrase field for SRT connection.&conn[][srtpbkl]=32
is SRT pbkeylen field for SRT connection - 16, 24 or 32.&conn[][srtstreamid]=
is SRT streamid identifier for SRT connection.&conn[][url]=rist://url.to:port/
is one more connection URL.&conn[][ristProfile]=s
is RIST profile. "s" for Simple, "m" for Main (default).&conn[][zixiLatency]=1000
is a zixi protocol latency in a range of 30-10000 milliseconds. Default is 1000 ms.&conn[][zixiPassword]=passphrase
is a zixi stream password.&conn[][zixiBonding]=on
defines if Wi-Fi + Cellural bonding is enabled. Disabled by default.&conn[][fecOverhead]=30
is a FEC overhead in a range of 0-50%. Default is 30%.&conn[][fecBlocksize]=150
is a FEC blocksize in a range of 0-1000 milliseconds. Default is 150 ms.&conn[][zixiIgnoreDtls]=on
defines whether to ignore DTLS certificate errors. Disabled by default.&conn[][zixiEncType]=none
is a zixi encryption type. Can be "none" or "aes128" - AES-128, "aes192" - AES-192, "aes-256" - AES-256, "chacha20" - CHACHA20&conn[][zixiEncKey]=keyphrase
is a zixi encryption key string 32-64 characters long depending on the zixi encryption type. Isn"t present if the encryption type is "none".&conn[][zixiAdaptive]=none
is a zixi adaptive mode. Can be either "fec" or "none" (default).&tb[][url]=rtmps://url.to/app/stream
is the URL for a talkback connection. Refer to docs reference for more about that feature.&tb[][name]=Channel%20name
is the name which will be used in talkback connections list in your app.&tb[][buffer]=1000
talk back buffer size in milliseconds.&tb[][overwrite]=on
defines if a talkback connection with this name must be overwritten. on = overwrite, off = do not overwrite (default)&tb[][active]=off
defines if a talkback connection will be marked active when imported into Larix. on = will be checked (default), off = will not be checked&tb[][url]=srt://url.to:port/
is another talkback connection URL.&tb[][name]=My%20Channel%202
is a talkback connection name.&tb[][srtmode]=c
is SRT mode: "c" for Caller (Pull, default), "l" for Listener, "r" for Rendezvous.&tb[][srtlatency]=1000
is SRT latency field for SRT talkback connection.&tb[][srtmaxbw]=125000
is SRT maxbw field for SRT talkback connection.&tb[][srtpass]=passphrase
is SRT passphrase field for SRT talkback connection.&tb[][srtpbkl]=32
is SRT pbkeylen field for SRT talkback connection - 16, 24 or 32.&tb[][srtstreamid]=
is SRT streamid identifier for SRT talkback connection.&overlay[][name]=Overlay%20name
is the name which will be used in the list of overlays in your app.&overlay[][type]=img
defines either image or text overlay type. Possible values are "img" and "txt".&overlay[][url]=https://url.to/overlay-image
is http or https based URL of an overlay image.&overlay[][text]=Overlay%20text
is a text which is shown if the overlay type is "txt" and the url is empty.&overlay[][overwrite]=on
defines if existing overlay with this name must be overwritten. on = overwrite, off = do not overwrite (default)&overlay[][active]=off
defines if an overlay will be marked active when imported into Larix. on = will be checked (default), off = will not be checked&overlay[][pause]=on
defines if an overlay will be used as pause image. Possible values are "on" and "off".&overlay[][standby]=on
defines if an overlay will be used as standby image. Possible values are "on" and "off".&overlay[][opacity]=0.5
is CSS opacity of an overlay in range of 0.0 to 1.0. Default is 1.0.&overlay[][zindex]=3
is CSS zindex value of an overlay.&overlay[][reload]=60
is an overlay image reload interval in seconds.&overlay[][size]=0.8
is an overlay size represented in fraction of the video size. The value should be in range of 0.0 to 1.0.&overlay[][x]=0.2
is left offset of an overlay represented in fraction of the video width. The value should be in range of 0.0 to 1.0.&overlay[][y]=0.1
is top offset of an overlay represented in fraction of the video height. The value should be in range of 0.0 to 1.0.&widget[][name]=Widget%20name
is the name which will be used in the list of widgets in your app.&widget[][url]=https://url.to/widget
is the URL of a widget stream.&widget[][mode]=ps
is a view mode. Possible values are "p" (preview), "s" (stream), "ps" (both).&widget[][overwrite]=on
defines if existing widget with this name must be overwritten. on = overwrite, off = do not overwrite (default)&widget[][active]=off
defines if a widget will be marked active when imported into Larix. on = will be checked (default), off = will not be checked&widget[][css]=
is a set of CSS rules applied to a widget.&widget[][x]=0.2
is left offset of a widget represented in fraction of the video width. The value should be in range of 0.0 to 1.0.&widget[][y]=0.1
is top offset of a widget represented in fraction of the video height. The value should be in range of 0.0 to 1.0.&widget[][w]=0.6 / 800
is a widget width represented in fraction of the video width (for iOS) or in pixels (for Android). The value for iOS is a float in range of 0.0 to 1.0. The value for Android is an integer.&widget[][h]=32 / 600
is a widget height represented in fraction of the video height (for iOS) or in pixels (for Android). The value for iOS is a float in range of 0.0 to 1.0. The value for Android is an integer.&widget[][zindex]=3
is CSS zindex value of a widget.&widget[][zoom]=1.5
is a magnification level of a widget represented in decimal value. Default value is 1.0.&widget[][fps]=30
is the frame rate of the video rendered in a widget. The value is an integer representing frames per second.&enc[vid][camera]=0
is a camera selected by default, "0" is for rear camera, "1" is for frontal (selfie) camera.&enc[vid][res]=1280x720
is the resolution defined as widthxheigth.&enc[vid][fps]=30
if a frame rate value.&enc[vid][bitrate]=1900
is a bitrate is Kbps.&enc[vid][format]=avc
defines a codec, "avc" is AVC/H.264, "hevc" is HEVC/H.265.&enc[vid][keyframe]=2
is a keyframe interval.enc[vid][orientation]=landscape
screen orientation for iOS. landscape = Landscape, portrait = Portrait (default).enc[vid][liveRotation]=follow
defines live rotation modes. off = disable it (default), follow = "Follow screen rotation", lock = "Lock while broadcasting".enc[vid][multiCam]=off
sets multi-camera mode in iOS. off = disable it (default), pip = Picture-in-picture, sbs = Side-by-Side.enc[vid][backLens]=auto
sets camera backlense in iOS. Values are "auto", "wide", "ultrawide" and "tele".enc[vid][adaptiveBitrate]=0|1|2|3
sets ABR mode. 0 = disable (default), 1 = Logarithmic descend, 2 = Ladder ascend, 3 = Hybrid approach.enc[vid][adaptiveFps]=off
sets adaptive FPS in ABR. It's Off (default) and On respectively.&enc[aud][bitrate]=128
is audio bitrate in Kbps.&enc[aud][channels]=2
is audio channels count.&enc[aud][samples]=48000
is audio sample rate.&enc[aud][audioOnly]=on
enables audio-only capture: disable preview, stream from background, no video in output stream.&enc[record][enabled]=on
enables recording in Larix.&enc[record][duration]=15
Length of recording chunk in minutes. Default is 0, means you won't have chunks.&enc[record][storage]=cloud
defines storage location for iOS. local = Local storage (default), photo_library = Photo library, cloud = iCloud.&enc[record][custom]=on
enables custom recording settings. When it's on, it applies res/bitrate/format.&enc[record][res]=1280x720
is a resolution defined as widthxheigth. Matches original stream if empty.&enc[record][bitrate]=1900
is a video bitrate is Kbps.&enc[record][format]=hevc
defines a codec, "avc" is AVC/H.264, "hevc" is HEVC/H.265.&enc[adv][max_conn]=3
defines maximum number of active connections in range of 1 to 5.&enc[adv][check_network]=on
defines whether to check network conditions, default is "on".&enc[adv][metadata]=timeinfo
defines whether encoder sends SEI timecode. Can be either "none" or "timeinfo".&enc[adv][ntp]=ntphostname
specifies NTP host name if SEI timecode is enabled.&enc[adv][timeout][reconn]=30
is reconnect timeout in seconds.&enc[adv][timeout][reconn_no_network]=180
is reconnect timeout without network in seconds.&enc[adv][timeout][idle]=600
is idle timeout in seconds.&enc[adv][timeout][unsent]=5
is unsent timeout in seconds. Applicable to iOS only.& deleteConn=1
Makes Larix to delete all existing connections and import new ones from scratch.
URL examples
The smallest valid Grove-compliant RTMP URL would be:
larix://set/v1?conn[][url]=rtmp%3A%2F%2Furl.to%2Fapp%2Fstream
It will add a new RTMP connection without any authorization.
SRT connection:
larix://set/v1?conn[][url]=srt%3A%2F%2F192.168.0.10%3A12345&conn[][name]=SRT%20input&conn[][srtlatency]=120
This is an SRT connection with low latency for streaming inside of local network.
YouTube stream:
larix://set/v1?conn[][url]=rtmp%3A%2F%2Fa.rtmp.youtube.com%2Flive2%2Fabcd-efgh-abcd-efgh&conn[][name]=YouTube&conn[][mode]=av
You can see a typical YouTube publishing URL and mode is set to Video+audio, as YouTube cannot take video-only or audio-only stream.
Two connections with FPS setting:
larix://set/v1?conn[][url]=rtmps%3A%2F%2Fstreaming.service.com%2Finput%2F1&conn[][name]=main%20input&conn[][target]=rtmp&conn[][user]=user&conn[][pass]=pass&conn[][url]=rtmps%3A%2F%2Fstreaming.service.com%2Finput%2F2&conn[][name]=secondary%20input&conn[][user]=user&conn[][pass]=pass&enc[vid][fps]=30
This will add two RTMPS secure connections (primary and secondary) each with RTMP authentication, and the video encoder will be set to have 30 FPS.