An open API service indexing awesome lists of open source software.

https://github.com/bigbluebutton/bbb-webrtc-recorder

Record
https://github.com/bigbluebutton/bbb-webrtc-recorder

Last synced: 10 months ago
JSON representation

Record

Awesome Lists containing this project

README

          

# bbb-webrtc-recorder

### Installation

Install `.deb` package using `apt` or `apt-get`:

```
apt update
apt install ./bbb-webrtc-recorder_x.x-x_amd64.deb
```

It depends on `redis` package which will be installed automatically.

### Configuration

Default configuration file:

```
/etc/bbb-webrtc-recorder/bbb-webrtc-recorder.yml
```

```yaml
log:
level: INFO # TRACE, DEBUG, INFO, WARN, ERROR, FATAL

recorder:
# Directory where the recorder will save files
directory: /var/lib/bbb-webrtc-recorder
# File mode permissions for the recording directories (octal)
dirFileMode: 0700
# File mode permissions for the recording files (octal)
fileMode: 0700
# Whether to write to /dev/null instead of a file (for testing)
writeToDevNull: false
# Whether an IVF copy of WebM recordings should be generated
writeIVFCopy: false
# Write a stats file for each recording
writeStatsFile: false
videoPacketQueueSize: 256
audioPacketQueueSize: 32
useCustomSampler: true

pubsub:
channels:
# PubSub channel where the recorder will receive messages
subscribe: to-bbb-webrtc-recorder
# PubSub channel where the recorder will send messages
publish: from-bbb-webrtc-recorder
# The adapter which will be used for PubSub connection
adapter: redis
# PubSub adapter-specific configuration
adapters:
redis:
address: :6379
network: tcp
#password: foobared

webrtc:
# UDP port range to be used
rtcMinPort: 24577
rtcMaxPort: 32768
# Jitter Buffer size
jitterBuffer: 512
# List of IceServers used for RTC
iceServers:
- urls:
- stun:stun.l.google.com:19302
# Example turn server
# - urls:
# - turn:turnserver.example.org:1234
# username: webrtc
# credential: turnpassword

# HTTP server for testing
# (should be disabled in production)
http:
port: 8080
enable: true
```

Default `env` file used by SystemD service:
* Note: all environment variables must be prefixed with `BBBRECORDER_`
* Note: all environment variables must be upper case
* Note: nested objects are separated by `_` (underscore)
- Example: `BBBRECORDER_RECORDER_DIRECTORY=/var/lib/bbb-webrtc-recorder` (equivalent of `recorder.directory` in config file)

```
/etc/default/bbb-webrtc-recorder
```

Systemd service:

```
systemctl enable --now bbb-webrtc-recorder
systemctl status bbb-webrtc-recorder
```

Make sure to start `redis`:

```
systemctl enable --now redis
systemctl status redis
```

### Debugging

Examples of how to print out config values:

```
bbb-webrtc-recorder [-c config.yml] --dump http
bbb-webrtc-recorder [-c config.yml] --dump http.port
bbb-webrtc-recorder [-c config.yml] --dump recorder.directory
```

Viewing SystemD logs:

```
journalctl -u bbb-webrtc-recorder -f
```

### PubSub events/calls

`startRecording` (SFU -> Recorder)

```json5
{
id: 'startRecording',
recordingSessionId: , // requester-defined - error out if collision
fileName: , // file name INCLUDING format (.webm)
adapter: , // "mediasoup" or "livekit" - defaults to "mediasoup" if not specified
adapterOptions: {
// mediasoup-specific options
mediasoup?: {
sdp: , // required for mediasoup adapter if legacy sdp is not provided
},
// LiveKit-specific options
livekit?: {
room: , // required for livekit adapter
trackIds: , // required for livekit adapter - array of track IDs to record
}
},
// Legacy field for backward compatibility
sdp?: , // offer - required for mediasoup adapter if adapterOptions.mediasoup.sdp is not provided
}
```

`startRecordingResponse` (Recorder -> SFU)

```json5
{
id: "startRecordingResponse",
recordingSessionId: , // file name,
status: "ok" | "failed",
error: undefined | ,
sdp: , // answer
fileName: , // full path to recording
}
```

`recordingRtpStatusChanged` (Recorder -> SFU)

```json5
{
id: "recordingRtpStatusChanged", // media started or stopped flowing
status: "flowing" | "not_flowing",
recordingSessionId: , // file name
timestampUTC: , // latest/trigger frame ts, UTC
timestampHR: , //monotonic system time (latest/trigger frame ts),
}
```

`stopRecording` (SFU -> Recorder)

```json5
{
id: "stopRecording",
recordingSessionId: , // file name
}
```

`recordingStopped` (Recorder -> SFU)

```json5
{
id: "recordingStopped",
recordingSessionId: , // file name
reason: ,
timestampUTC: , // last written frame timestamp, UTC, wall clock
timestampHR: // last written frame timestamp, monotonic system time
}
```

`getRecorderStatus` (* -> Recorder)
```JSON5
{
id: 'getRecorderStatus',
}
```

`recorderStatus` (Recorder -> *)

```JSON5
{
id: 'recorderStatus', // Triggered by getRecorderStatus
appVersion: , // version of the recorder
instanceId: , // unique instance id
timestamp: , // event generation timestamp
}
```