Plugin files
One file per plugin, named janus.plugin.<name>.jcfg. Plugin behaviour is on the plugin pages. The Lua and Duktape plugins only load when their file names a script in general.script.
How to read the tables
Sample is the value in the C sample file. In the port says whether the Rust source mentions the key as a string (read) or not (not found). It is a grep, not a proof: a key that is "read" may be read only in some modes, and a key that is "not found" is accepted and ignored with a warning, as the compatibility notes describe.
EchoTest
File: janus.plugin.echotest.jcfg in the configs folder. Sample: conf/janus.plugin.echotest.jcfg.sample in the C repo.
(top level)
| Key | Sample | Meaning | In the port |
|---|---|---|---|
events | true|false, whether events should be sent to event handlers | read |
general
| Key | Sample | Meaning | In the port |
|---|---|---|---|
events | false (commented out) | read |
VideoRoom
File: janus.plugin.videoroom.jcfg in the configs folder. Sample: conf/janus.plugin.videoroom.jcfg.sample in the C repo.
}
room-<unique room ID>
| Key | Sample | Meaning | In the port |
|---|---|---|---|
description | This is my awesome room (commented out) | read | |
is_private | true|false (whether this room should be in the public list, default=true) | read | |
secret | <optional password needed for manipulating (e.g. destroying) the room> | read | |
pin | <optional password needed for joining the room> | read | |
require_pvtid | true|false (whether subscriptions are required to provide a valid private_id to associate with a publisher, default=false) | read | |
signed_tokens | true|false (whether access to the room requires signed tokens; default=false, only works if signed tokens are used in the core as well) | read | |
publishers | <max number of concurrent senders> (e.g., 6 for a video conference or 1 for a webinar) | read | |
bitrate | <max video bitrate for senders> (e.g., 128000) | read | |
bitrate_cap | true|false (whether the above cap should act as a hard limit to dynamic bitrate changes by publishers; default=false, publishers can go beyond that) | read | |
fir_freq | <send a FIR to publishers every fir_freq seconds> (0=disable) | read | |
audiocodec | opus|g722|pcmu|pcma|isac32|isac16 (audio codec(s) to force on publishers, default=opus can be a comma separated list in order of preference, e.g., opus,pcmu) | read | |
videocodec | vp8|vp9|h264|av1|h265 (video codec(s) to force on publishers, default=vp8 can be a comma separated list in order of preference, e.g., vp9,vp8,h264) | read | |
vp9_profile | VP9-specific profile to prefer (e.g., "2" for "profile-id=2") | read | |
h264_profile | H.264-specific profile to prefer (e.g., "42e01f" for "profile-level-id=42e01f") | read | |
opus_fec | true|false (whether inband FEC must be negotiated; only works for Opus, default=true) | read | |
opus_dtx | true|false (whether DTX must be negotiated; only works for Opus, default=false) | read | |
audiolevel_ext | true|false (whether the ssrc-audio-level RTP extension must be negotiated/used or not for new publishers, default=true) | read | |
audiolevel_event | true|false (whether to emit event to other users or not, default=false) | read | |
audio_active_packets | 100 (number of packets with audio level, default=100, 2 seconds) | read | |
audio_level_average | 25 (average value of audio level, 127=muted, 0='too loud', default=25) | read | |
videoorient_ext | true|false (whether the video-orientation RTP extension must be negotiated/used or not for new publishers, default=true) | read | |
playoutdelay_ext | true|false (whether the playout-delay RTP extension must be negotiated/used or not for new publishers, default=true) | read | |
transport_wide_cc_ext | true|false (whether the transport wide CC RTP extension must be negotiated/used or not for new publishers, default=true) | read | |
record | true|false (whether this room should be recorded, default=false) | read | |
rec_dir | <folder where recordings should be stored, when enabled> | read | |
lock_record | true|false (whether recording can only be started/stopped if the secret is provided, or using the global enable_recording request, default=false) | read | |
notify_joining | true|false (optional, whether to notify all participants when a new participant joins the room. The Videoroom plugin by design only notifies new feeds (publishers), and enabling this may result extra notification traffic. This flag is particularly useful when enabled with require_pvtid for admin to manage listening only participants. default=false) | read | |
require_e2ee | true|false (whether all participants are required to publish and subscribe using end-to-end media encryption, e.g., via Insertable Streams; default=false) | read | |
dummy_publisher | true|false (whether a dummy publisher should be created in this room, with one separate m-line for each codec supported in the room; this is useful when there's a need to create subscriptions with placeholders for some or all m-lines, even when they aren't used yet; default=false) | read | |
dummy_streams | in case dummy_publisher is set to true, array of codecs to offer, (commented out) | optionally with a fmtp attribute to match (codec/fmtp properties). If not provided, all codecs enabled in the room are offered, with no fmtp. Notice that the fmtp is parsed, and only a few codecs are supported. | read |
dummy_e2ee | true|false (whether the dummy publisher should be advertised as supporting end-to-end encryption; default=value of room's require_e2ee) | read | |
threads | number of threads to assist with the relaying of publishers in the room; as (commented out) | in the Streaming plugin, this setting can help if you expect a lot of subscribers that may cause the plugin to slow down and fail to catch up (default=0) | read |
general
| Key | Sample | Meaning | In the port |
|---|---|---|---|
admin_key | "supersecret" (commented out) | If set, rooms can be created via API only if this key is provided in the request | read |
lock_rtp_forward | true (commented out) | Whether the admin_key above should be enforced for RTP forwarding requests too | not found |
events | false (commented out) | Whether events should be sent to event handlers (default=true) | read |
string_ids | true (commented out) | By default, integers are used as a unique ID for both rooms and participants. In case you want to use strings instead (e.g., a UUID), set string_ids to true. | read |
room-1234
| Key | Sample | Meaning | In the port |
|---|---|---|---|
description | "Demo Room" | read | |
secret | "adminpwd" | read | |
publishers | 6 | read | |
bitrate | 128000 | This is a low cap, increase if you want to use simulcast or SVC | read |
fir_freq | 10 | read | |
audiocodec | "opus" (commented out) | read | |
videocodec | "vp8" (commented out) | read | |
record | false | read | |
rec_dir | "/path/to/recordings-folder" (commented out) | read |
VideoCall
File: janus.plugin.videocall.jcfg in the configs folder. Sample: conf/janus.plugin.videocall.jcfg.sample in the C repo.
(top level)
| Key | Sample | Meaning | In the port |
|---|---|---|---|
events | true|false, whether events should be sent to event handlers | read |
general
| Key | Sample | Meaning | In the port |
|---|---|---|---|
events | false (commented out) | read |
Streaming
File: janus.plugin.streaming.jcfg in the configs folder. Sample: conf/janus.plugin.streaming.jcfg.sample.in in the C repo.
You can configure static mountpoints that should be made available when Janus starts in this configuration file. The syntax and the available properties are listed below. Notice that, for the sake of simplicity, only the global and legacy properties are listed in the following text: you can use the new stream-based syntax as well (see the 'multistream-test' example below for reference), but in that case all properties whose names start with audio/video/data should be renamed to have that prefix removed. Please refer to the Streaming plugin documentation for more details, as the static configuration in that case mirrors the dynamic API syntax. Note: by default, the Streaming plugin only forwards the latest packets it receives, never performing any buffering. This means that, for video streams, new viewers may initially start receiving frames they cannot decode right away, since they'd refer to keyframes that were sent before they joined. In such scenarios, they'd have to wait until the next keyframe arrives before video can be decoded and displayed, which could take a while depending on the frequency of keyframes encoded by the source. For forwarded streams (e.g., from the VideoRoom) this can be easily addressed by using the RTCP support. For sources that can't or won't honour dynamic keyframe requests, a partial and experimental solution might be storing the latest keyframe and the following deltas, to send to new viewers before new live packet are delivered. This feature can be enabled in the Streaming plugin using the 'bufferkf_ms' and/or the 'bufferkf_bytes' properties, which configure how many milliseconds or how many bytes (in total) should be stored any time a keyframe is received: data exceeding those limits won't be stored, until a new keyframe arrives. The two properties are not mutually exclusive, and can be configured at the same time: in that case, the first one that hits the limit stops the buffering of the current keyframe. Notice that, again, this feature should be considered highly experimental, and that it comes with a few considerable drawbacks: the most obvious one is that, depending on how many packets were stored, new viewers may be hit with a considerable burst of data as soon as they connect, which may negatively impact performance or even cause issues of its own. Also notice that this is a global, and not per-stream, feature: this means that if you create a mountpoint with two video streams, the feature will impact both of them, and both streams will have a buffer of their own. This also works for RTSP mountpoints. In case you want to use SRTP for your RTP-based mountpoint, you'll need to configure the SRTP-related properties as well, namely the suite to use for hashing (32 or 80) and the crypto information for decrypting the stream (as a base64 encoded string the way SDES does it). Notice that with SRTP involved you'll have to pay extra attention to what you feed the mountpoint, as you may risk getting SRTP decrypt errors: The Streaming plugin can also be used to (re)stream media that has been encrypted using something that can be consumed via Insertable Streams. In that case, we only need to be aware of it, so that we can send the info along with the SDP. How to decrypt the media is out of scope, and up to the application since, again, this is end-to-end encryption and so neither Janus nor the Streaming plugin have access to anything. DO NOT SET THIS PROPERTY IF YOU DON'T KNOW WHAT YOU'RE DOING! To allow mountpoints to negotiate the playout-delay RTP extension, you can set the 'playoutdelay_ext' property to true: this way, any subscriber can customize the playout delay of incoming video streams, assuming the browser supports the RTP extension in the first place. To allow mountpoints to negotiate the abs-capture-time RTP extension, you can set the 'abscapturetime_src_ext_id' property to value in range 1..14 inclusive: this way, any subscriber can receive the abs-capture-time of incoming RTP streams, assuming the browser supports the RTP extension in the first place. Incoming RTP stream should provide abs-capture-time exactly in the same header id. The following options are only valid for the 'rtsp' type: Notice that, for 'rtsp' mountpoints, normally the plugin uses the exact SDP codec and fmtp attributes the remote camera or RTSP server sent. In case the values set remotely are known to conflict with WebRTC viewers, you can override both using the settings introduced above. To test the 'gstreamer-sample' example, check the test_gstreamer.sh script in the plugins/streams folder. The live and on-demand audio file streams, use a couple of files (radio.alaw, music.mulaw) that are provided in the plugins/streams folder. }
stream-name
| Key | Sample | Meaning | In the port |
|---|---|---|---|
type | rtp|live|ondemand|rtsp rtp = stream originated by an external tool (e.g., gstreamer or ffmpeg) and sent to the plugin via RTP live = local file streamed live to multiple listeners (multiple listeners = same streaming context) ondemand = local file streamed on-demand to a single listener (multiple listeners = different streaming contexts) rtsp = stream originated by an external RTSP feed (only available if libcurl support was compiled) | read | |
id | <unique numeric ID> (if missing, a random one will be generated) | read | |
description | This is my awesome stream (commented out) | read | |
metadata | An optional string that can contain any metadata (e.g., JSON) associated with the stream you want users to receive | read | |
is_private | true|false (private streams don't appear when you do a 'list' request) | read | |
secret | <optional password needed for manipulating (e.g., destroying or enabling/disabling) the stream> | read | |
pin | <optional password needed for watching the stream> | read | |
filename | path to the local file to stream (only for live/ondemand) | read | |
audio | true|false (do/don't stream audio) | read | |
video | true|false (do/don't stream video) The following options are only valid for the 'rtp' type: | read | |
data | true|false (do/don't stream text via datachannels) | read | |
audioport | local port for receiving audio frames (commented out) | read | |
audiortcpport | local port, if any, for receiving and sending audio RTCP feedback (commented out) | read | |
audiomcast | multicast group port for receiving audio frames, if any (commented out) | read | |
audioiface | network interface or IP address to bind to, if any (binds to all otherwise) | read | |
audiopt | <audio RTP payload type> (e.g., 111) | read | |
audiocodec | name of the audio codec (e.g., opus) | read | |
audioskew | true|false (whether the plugin should perform skew analisys and compensation on incoming audio RTP stream, EXPERIMENTAL) | read | |
videoport | local port for receiving video frames (commented out) | read | |
videortcpport | local port, if any, for receiving and sending video RTCP feedback (commented out) | read | |
videomcast | multicast group port for receiving video frames, if any (commented out) | read | |
videoiface | network interface or IP address to bind to, if any (binds to all otherwise) | read | |
videopt | <video RTP payload type> (e.g., 100) | read | |
videocodec | name of the video codec (e.g., vp8) | read | |
videosimulcast | true|false (do|don't enable video simulcasting) | read | |
videoport2 | second local port for receiving video frames (only for rtp, and simulcasting) | read | |
videoport3 | third local port for receiving video frames (only for rtp, and simulcasting) | read | |
videoskew | true|false (whether the plugin should perform skew analisys and compensation on incoming video RTP stream, EXPERIMENTAL) | read | |
videosvc | true|false (whether the video will have SVC support; works only for VP9-SVC, default=false) | read | |
h264sps | if using H.264 as a video codec, value of the sprop-parameter-sets (commented out) | that would normally be sent via SDP, but that we'll use to instead manually ingest SPS and PPS packets via RTP for streams that miss it | read |
collision | in case of collision (more than one SSRC hitting the same port), the plugin will discard incoming RTP packets with a new SSRC unless this many milliseconds passed, which would then change the current SSRC (0=disabled) | read | |
dataport | local port for receiving data messages to relay (commented out) | read | |
dataiface | network interface or IP address to bind to, if any (binds to all otherwise) | read | |
datatype | text|binary (type of data this mountpoint will relay, default=text) | read | |
databuffermsg | true|false (whether the plugin should store the latest message and send it immediately for new viewers) | read | |
threads | number of threads to assist with the relaying part, which can help (commented out) | if you expect a lot of viewers that may cause the RTP receiving part in the Streaming plugin to slow down and fail to catch up (default=0) | read |
bufferkf_ms | how many milliseconds of packets to store, starting (commented out) | from a new keyframe (default=0) | read |
bufferkf_bytes | how many bytes of packets to store, starting (commented out) | from a new keyframe (default=0) | read |
srtpsuite | 32 (commented out) | read | |
srtpcrypto | WbTBosdVUZqEb6Htqhn+m3z7wUh4RJVR8nE15GbN (commented out) | read | |
e2ee | true (commented out) | read | |
playoutdelay_ext | true (commented out) | read | |
abscapturetime_src_ext_id | 1 (commented out) | read | |
url | RTSP stream URL (only for restreaming RTSP) | read | |
rtsp_user | RTSP authorization username (only if type=rtsp) | read | |
rtsp_pwd | RTSP authorization password (only if type=rtsp) | read | |
rtsp_quirk | Some RTSP servers offer the stream using only the path, instead of the fully qualified URL. (commented out) | If set true, this boolean informs Janus that we should try a path-only DESCRIBE request if the initial request returns 404. | read |
rtsp_failcheck | whether an error should be returned if connecting to the RTSP server fails (default=true) | read | |
rtspiface | network interface or IP address to bind to, if any (binds to all otherwise), when receiving RTSP streams | read | |
rtsp_reconnect_delay | after n seconds passed and no media assumed, the RTSP server has gone and schedule a reconnect (default=5s) | read | |
rtsp_session_timeout | by default the streaming plugin will check the RTSP connection with an OPTIONS query, (commented out) | the value of the timeout comes from the RTSP session initializer and by default this session timeout is the half of this value In some cases this value can be too high (for example more than one minute) because of the media server. In that case this plugin will calculate the timeout with this formula: timeout = min(session_timeout, rtsp_session_timeout / 2). (default=0s) | read |
rtsp_timeout | communication timeout (CURLOPT_TIMEOUT) for cURL call gathering the RTSP information (default=10s) | read | |
rtsp_conn_timeout | connection timeout for cURL (CURLOPT_CONNECTTIMEOUT) call gathering the RTSP information (default=5s) | read | |
rtsp_notify_changes | if set to true, will send an event to connected users when the RTSP session (commented out) | gets disconnected, and when it's reconnected (default=false) | read |
rtsp_fmtp_sps | what the plugin should do it if finds SPS/PPS info in an SDP fmtp attribute sent by the RTSP server; (commented out) | the default value is "always", to manually inject them in RTP traffic, as that's what WebRTC endpoints need; to disable this behaviour (e.g., if the camera already sends SPS/PPS in-stream via RTP too) use "never" | read |
general
| Key | Sample | Meaning | In the port |
|---|---|---|---|
admin_key | "supersecret" (commented out) | If set, mountpoints can be created via API only if this key is provided in the request | read |
rtp_port_range | "20000-40000" (commented out) | Range of ports to use for RTP/RTCP when '0' is passed as port for a mountpoint (default=10000-60000) | read |
events | false (commented out) | Whether events should be sent to event handlers (default=true) | read |
string_ids | true (commented out) | By default, integers are used as a unique ID for both mountpoints. In case you want to use strings instead (e.g., a UUID), set string_ids to true. | read |
rtp-sample
| Key | Sample | Meaning | In the port |
|---|---|---|---|
type | "rtp" | read | |
id | 1 | read | |
description | "Opus/VP8 live stream coming from external source" | read | |
metadata | "You can use this metadata section to put any info you want!" | read | |
audio | true | read | |
video | true | read | |
audioport | 5002 | read | |
audiopt | 111 | read | |
audiocodec | "opus" | read | |
videoport | 5004 | read | |
videopt | 100 | read | |
videocodec | "vp8" | read | |
secret | "adminpwd" | read |
multistream-test
| Key | Sample | Meaning | In the port |
|---|---|---|---|
type | "rtp" | read | |
id | 123 | read | |
description | "Multistream test (1 audio, 2 video)" | read | |
metadata | "This is an example of a multistream mountpoint: you'll get an audio stream and two video feeds" | read | |
media | ( | read | |
mid | "a" | read | |
label | "Audio stream" | read | |
port | 5102 | read | |
pt | 111 | read | |
codec | "opus" | read | |
secret | "adminpwd" | read |
file-live-sample
| Key | Sample | Meaning | In the port |
|---|---|---|---|
type | "live" | read | |
id | 2 | read | |
description | "Pseudo-live radio broadcast (a-law file source)" | read | |
metadata | "This is a pseudo-live stream, whose source is actually a static Opus file on the disk: the Streaming plugin goes through the file in real-time, and sends the frames via RTP. It's pseudo-live because it progresses even when there are no subscribers, and all subscribers get the same audio." | read | |
filename | "@streamdir@/radio.alaw" | read | |
audio | true | read | |
video | false | read | |
secret | "adminpwd" | read |
file-ondemand-sample
| Key | Sample | Meaning | In the port |
|---|---|---|---|
type | "ondemand" | read | |
id | 3 | read | |
description | "Remembrance, by Lorenzo Miniero (stereo music, Opus)" | read | |
metadata | "This is an on-demand stream, whose source is actually a static Opus file on the disk: when a subscriber opens it, the Streaming plugin starts from the beginning and goes through the file in real-time, and sends the frames via RTP. Unlike the pseudo-live sample, each subscriber opening it will experience a personal playout." | read | |
filename | "@streamdir@/remembrance.opus" | read | |
audio | true | read | |
audiopt | 100 | read | |
audiortpmap | "opus/48000/2" | read | |
audiofmtp | "stereo=1" | read | |
video | false | read | |
secret | "adminpwd" | read |
h264-sample
| Key | Sample | Meaning | In the port |
|---|---|---|---|
type | "rtp" (commented out) | read | |
id | 10 (commented out) | read | |
description | "H.264 live stream coming from gstreamer" (commented out) | read | |
audio | false (commented out) | read | |
video | true (commented out) | read | |
videoport | 8004 (commented out) | read | |
videopt | 126 (commented out) | read | |
videocodec | "h264" (commented out) | read | |
videofmtp | "profile-level-id=42e01f;packetization-mode=1" (commented out) | read | |
secret | "adminpwd" (commented out) | read |
data-example
| Key | Sample | Meaning | In the port |
|---|---|---|---|
type | "rtp" (commented out) | read | |
id | 15 (commented out) | read | |
description | "Datachannel stream from an UDP source" (commented out) | read | |
audio | false (commented out) | read | |
video | false (commented out) | read | |
data | true (commented out) | read | |
dataport | 5008 (commented out) | read | |
datatype | "text" (commented out) | read | |
secret | "adminpwd" (commented out) | read |
rtp-multicast
| Key | Sample | Meaning | In the port |
|---|---|---|---|
type | "rtp" (commented out) | read | |
id | 20 (commented out) | read | |
description | "Opus/VP8 live multicast stream sample" (commented out) | read | |
audio | true (commented out) | read | |
video | true (commented out) | read | |
audioport | 5002 (commented out) | read | |
audiomcast | "232.3.4.5" (commented out) | read | |
audiopt | 111 (commented out) | read | |
audiocodec | "opus" (commented out) | read | |
videoport | 5004 (commented out) | read | |
videomcast | "232.3.4.5" (commented out) | read | |
videopt | 100 (commented out) | read | |
videocodec | "vp8" (commented out) | read | |
secret | "adminpwd" (commented out) | read |
rtsp-test
| Key | Sample | Meaning | In the port |
|---|---|---|---|
type | "rtsp" (commented out) | read | |
id | 99 (commented out) | read | |
description | "RTSP Test" (commented out) | read | |
audio | false (commented out) | read | |
video | true (commented out) | read | |
url | "rtsp://127.0.0.1:8554/unicast" (commented out) | read | |
rtsp_user | "username" (commented out) | read | |
rtsp_pwd | "password" (commented out) | read | |
secret | "adminpwd" (commented out) | read | |
rtsp_reconnect_delay | 5 (commented out) | read | |
rtsp_session_timeout | 0 (commented out) | read | |
rtsp_timeout | 10 (commented out) | read | |
rtsp_conn_timeout | 5 (commented out) | read |
RecordPlay
File: janus.plugin.recordplay.jcfg in the configs folder. Sample: conf/janus.plugin.recordplay.jcfg.sample.in in the C repo.
(top level)
| Key | Sample | Meaning | In the port |
|---|---|---|---|
path | where to place recordings in the file system (commented out) | read | |
admin_key | plugin management secret; if set, private recordings can (commented out) | be listed only if this key is provided in the request | read |
private | true|false, whether recordings should be marked as private by default, meaning they're not returned to users connecting to the plugin unless they provide the right 'admin_key' in the request | read | |
events | true|false, whether events should be sent to event handlers | read |
general
| Key | Sample | Meaning | In the port |
|---|---|---|---|
path | "@recordingsdir@" | read | |
admin_key | "supersecret" (commented out) | read | |
private | true (commented out) | read | |
events | false (commented out) | read |
TextRoom
File: janus.plugin.textroom.jcfg in the configs folder. Sample: conf/janus.plugin.textroom.jcfg.sample in the C repo.
}
room-<unique room ID>
| Key | Sample | Meaning | In the port |
|---|---|---|---|
description | This is my awesome room (commented out) | read | |
is_private | true|false (whether this room should be in the public list, default=true) | read | |
secret | <optional password needed for manipulating (e.g. destroying) the room> | read | |
pin | <optional password needed for joining the room> | read | |
history | <number of messages to store as a history, and send back to new participants (default=0, no history)> | read | |
post | <optional backend to contact via HTTP post for all incoming messages> | read |
general
| Key | Sample | Meaning | In the port |
|---|---|---|---|
admin_key | "supersecret" (commented out) | If set, rooms can be created via API only if this key is provided in the request | read |
json | "compact" | Whether the data channel JSON messages should be indented (pretty), plain (no indentation) or compact (no indentation and no spaces) | read |
events | false (commented out) | Whether events should be sent to event handlers (default=true) | read |
string_ids | true (commented out) | By default, integers are used as a unique ID for rooms. In case you want to use strings instead (e.g., a UUID), set string_ids to true. | read |
room-1234
| Key | Sample | Meaning | In the port |
|---|---|---|---|
description | "Demo Room" | read | |
is_private | true (commented out) | read | |
secret | "adminpwd" | read | |
pin | "roompwd" (commented out) | read | |
history | 10 (commented out) | read | |
post | "http://example.com/forward/here" (commented out) | read |
AudioBridge
File: janus.plugin.audiobridge.jcfg in the configs folder. Sample: conf/janus.plugin.audiobridge.jcfg.sample in the C repo.
}
room-<unique room ID>
| Key | Sample | Meaning | In the port |
|---|---|---|---|
description | "This is my awesome room" (commented out) | read | |
is_private | true|false (whether this room should be in the public list, default=true) | read | |
secret | "<optional password needed for manipulating (e.g. destroying) the room>" | read | |
pin | "<optional password needed for joining the room>" | read | |
signed_tokens | true|false (whether access to the room requires signed tokens; default=false, only works if signed tokens are used in the core as well) | read | |
sampling_rate | <sampling rate> (e.g., 16000 for wideband mixing) | read | |
spatial_audio | true|false (if true, the mix will be stereo to spatially place users, default=false) | read | |
use_limiter | true|false (whether to use a limiter to avoid clipping, default=false) | read | |
audiolevel_ext | true|false (whether the ssrc-audio-level RTP extension must be negotiated/used or not for new joins, default=true) | read | |
audiolevel_event | true|false (whether to emit event to other users or not, default=false) | read | |
audio_active_packets | 100 (number of packets with audio level, default=100, 2 seconds) | read | |
audio_level_average | 25 (average value of audio level, 127=muted, 0='too loud', default=25) | read | |
default_expectedloss | percent of packets we expect participants may miss, to help with outgoing FEC (default=0, max=20; automatically used for forwarders too) | read | |
default_bitrate | default bitrate in bps to use for the all participants (default=0, which means libopus decides; automatically used for forwarders too) | read | |
denoise | true|false (whether denoising via RNNoise should be performed for each participant by default) | read | |
record | true|false (whether this room should be recorded, default=false) | read | |
record_file | "/path/to/recording.wav" (where to save the recording) | read | |
record_dir | "/path/to/" (path to save the recording to, makes record_file a relative path if provided) | read | |
mjrs | true|false (whether all participants in the room should be individually recorded to mjr files, default=false) | read | |
mjrs_dir | "/path/to/" (path to save the mjr files to) | read | |
allow_rtp_participants | true|false (whether participants should be allowed to join via plain RTP as well, rather than just WebRTC, default=false) | read | |
groups | optional, non-hierarchical, array of groups to tag participants, for external forwarding purposes only (commented out) | The following lines are only needed if you want the mixed audio to be automatically forwarded via plain RTP to an external component (e.g., an ffmpeg script, or a gstreamer pipeline) for processing By default plain RTP is used, SRTP must be configured if needed | read |
rtp_forward_id | numeric RTP forwarder ID for referencing it via API (optional: random ID used if missing) | read | |
rtp_forward_host | "<host address to forward RTP packets of mixed audio to>" | read | |
rtp_forward_host_family | "<ipv4|ipv6; by default, first family returned by DNS request>" | read | |
rtp_forward_port | port to forward RTP packets of mixed audio to (commented out) | read | |
rtp_forward_ssrc | SSRC to use to use when streaming (optional: stream_id used if missing) | read | |
rtp_forward_codec | opus (default), pcma (A-Law) or pcmu (mu-Law) | read | |
rtp_forward_ptype | payload type to use when streaming (optional: only read for Opus, 100 used if missing) | read | |
rtp_forward_group | group of participants to forward, if enabled in the room (optional: forwards full mix if missing) | read | |
rtp_forward_srtp_suite | length of authentication tag (32 or 80) | read | |
rtp_forward_srtp_crypto | "<key to use as crypto (base64 encoded key as in SDES)>" | read | |
rtp_forward_always_on | true|false, whether silence should be forwarded when the room is empty (optional: false used if missing) | read |
general
| Key | Sample | Meaning | In the port |
|---|---|---|---|
admin_key | "supersecret" (commented out) | If set, rooms can be created via API only if this key is provided in the request | read |
lock_rtp_forward | true (commented out) | Whether the admin_key above should be enforced for RTP forwarding requests too | read |
lock_play_file | true (commented out) | Whether the admin_key above should be enforced for playing .opus files too | read |
record_tmp_ext | "tmp" (commented out) | Optional temporary extension to add to filenames while recording: e.g., setting "tmp" would mean .wav --> .wav.tmp until the file is closed | read |
events | false (commented out) | Whether events should be sent to event handlers (default=true) | read |
string_ids | true (commented out) | By default, integers are used as a unique ID for both rooms and participants. In case you want to use strings instead (e.g., a UUID), set string_ids to true. | read |
rtp_port_range | "50000-60000" (commented out) | Normally, all AudioBridge participants will join by negotiating a WebRTC PeerConnection: the plugin also supports adding participants that will use plain RTP, though, be it for supporting legacy users (e.g., SIP participants who an orchestrator can add to the bridge) or more simply to temporarily inject external audio in a room from a live source. To support plain RTP, the plugin needs to have a range of ports it can bind to: notice this should be configured so that it doesn't conflict with other plugins (e.g., Streaming, SIP, NoSIP) and applications (e.g., Janus itself). The default if you don't specify anything is 10000-60000. In case we need to support plain RTP participants, we'll also need to know what local IP address to bind to for media. If no address is set in the property below, then one will be automatically guessed from the system. | read |
local_ip | "1.2.3.4" (commented out) | read |
room-1234
| Key | Sample | Meaning | In the port |
|---|---|---|---|
description | "Demo Room" | read | |
secret | "adminpwd" | read | |
sampling_rate | 16000 | read | |
record | false | read | |
use_limiter | false | read | |
record_dir | "/path/to/" (commented out) | read | |
record_file | "recording.wav" (commented out) | read |
SIP
File: janus.plugin.sip.jcfg in the configs folder. Sample: conf/janus.plugin.sip.jcfg.sample in the C repo.
general
| Key | Sample | Meaning | In the port |
|---|---|---|---|
local_ip | "1.2.3.4" (commented out) | Specify which local IP address to bind to for SIP stack. If not set it will be automatically guessed from the system | read |
local_media_ip | "1.2.3.4" (commented out) | Specify which local IP address to bind for the media stack. If not set it will be automatically set to the value of local_ip | read |
sdp_ip | "1.2.3.4" (commented out) | Specify which (public) IP address to advertise in the SDP. If not set, the value above or anything autodetected will be used | read |
keepalive_interval | 120 | Enable local keep-alives to keep the registration open. Keep-alives are sent in the form of OPTIONS requests, at the given interval inseconds. (0 to disable) | read |
behind_nat | false | Indicate if the server is behind NAT. If so, the server will use STUN to guess its own public IP address and use it in the Contact header of outgoing requests | read |
user_agent | "Cool WebRTC Gateway" (commented out) | User-Agent string to be used | read |
register_ttl | 3600 | Expiration time for registrations | read |
rtp_port_range | "20000-40000" | Range of ports to use for RTP/RTCP (default=10000-60000) | read |
events | false (commented out) | Whether events should be sent to event handlers (default=true) | read |
dscp_audio_rtp | 46 (commented out) | If you need DSCP packet marking and prioritization, you can configure the 'dscp_audio_rtp' and/or 'dscp_video_rtp' property to specific values, and the plugin will set it on all outgoing audio/video RTP packets. No packet marking is done if this parameter is undefined or equal to 0 | read |
dscp_video_rtp | 26 (commented out) | read | |
sips_certs_dir | "/etc/sip/certs" (commented out) | In case you want to use SIPS for some sessions, Sofia may need to have access to a certificate to use: this is especially true for Sofia >= 1.13, which will fail to create the agent if no certificate is available. By default, Sofia looks for 'agent.pem' and 'cafile.pem' in the '$HOME/.sip/auth' folder, but you can specify a different one by uncommenting and setting the property below. | read |
sip_timer_t1x64 | 32000 | Set the T1x64 timeout value (in milliseconds) used by the SIP transaction engine (default 32000 milliseconds) | read |
admin_key | "supersecret" (commented out) | If set, management requests (e.g., creating, listing and destroying RTP forwarders) only work if this key is provided as part of the the request | read |
NoSIP
File: janus.plugin.nosip.jcfg in the configs folder. Sample: conf/janus.plugin.nosip.jcfg.sample in the C repo.
general
| Key | Sample | Meaning | In the port |
|---|---|---|---|
local_ip | "1.2.3.4" (commented out) | Specify which local IP address to bind to for media. If not set it will be automatically guessed from the system | read |
sdp_ip | "1.2.3.4" (commented out) | Specify which (public) IP address to advertise in the SDP. If not set, the value above or anything autodetected will be used | read |
rtp_port_range | "20000-40000" | Range of ports to use for RTP/RTCP (default=10000-60000) | read |
events | false (commented out) | Whether events should be sent to event handlers (default=true) | read |
dscp_audio_rtp | 46 (commented out) | If you need DSCP packet marking and prioritization, you can configure the 'dscp_audio_rtp' and/or 'dscp_video_rtp' property to specific values, and the plugin will set it on all outgoing audio/video RTP packets. No packet marking is done if this parameter is undefined or equal to 0 | read |
dscp_video_rtp | 26 (commented out) | not found | |
admin_key | "supersecret" (commented out) | If set, management requests (e.g., creating, listing and destroying RTP forwarders) only work if this key is provided as part of the the request | read |
Lua
File: janus.plugin.lua.jcfg in the configs folder. Sample: conf/janus.plugin.lua.jcfg.sample.in in the C repo.
The only things you configure in here are which lua script to load and, optionally, the paths to add for searching libraries and a configuration file, if the script will need it. For what concerns the libraries path, by default this configuration file adds a path to where the Lua samples have been installed, as it contains a couple of helper libraries the samples use; should you be interested in adding more, just add other paths separated by a semicolon. Due to the syntax of the configuration file, make sure you escape all semicolons with a trailing slash, in case. The 'config' property is entirely script specific, instead: if your script will need to rely on an XML configuration file in its initialization, for instance, then set the 'config' property as the path to the file; it will be passed, as is, to your script in the init() call. None of the samples use this property, which is why it's commented out.
general
| Key | Sample | Meaning | In the port |
|---|---|---|---|
path | "@luadir@" | read | |
script | "@luadir@/echotest.lua" | read | |
config | "/path/to/configfile" (commented out) | read |
Duktape (JavaScript)
File: janus.plugin.duktape.jcfg in the configs folder. Sample: conf/janus.plugin.duktape.jcfg.sample.in in the C repo.
The only things you configure in here are which JavaScipt file to load and, optionally, the paths to add for searching libraries and a configuration file, if the script will need it. For what concerns the libraries path, by default this configuration file adds a path to where the JS samples have been installed, as it contains a couple of helper libraries the samples use; should you be interested in adding more, just add other paths separated by a semicolon. Due to the syntax of the configuration file, make sure you escape all semicolons with a trailing slash, in case. The 'config' property is entirely script specific, instead: if your script will need to rely on an XML configuration file in its initialization, for instance, then set the 'config' property as the path to the file; it will be passed, as is, to your script in the init() call. None of the samples use this property, which is why it's commented out.
general
| Key | Sample | Meaning | In the port |
|---|---|---|---|
path | "@duktapedir@" | read | |
script | "@duktapedir@/echotest.js" | read | |
config | "/path/to/configfile" (commented out) | read |