https://github.com/bigbluebutton/bbb-webrtc-recorder
Record
https://github.com/bigbluebutton/bbb-webrtc-recorder
Last synced: 10 months ago
JSON representation
Record
- Host: GitHub
- URL: https://github.com/bigbluebutton/bbb-webrtc-recorder
- Owner: bigbluebutton
- License: other
- Created: 2023-01-04T19:31:59.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-02-21T13:40:22.000Z (over 2 years ago)
- Last Synced: 2024-10-29T13:24:17.364Z (over 1 year ago)
- Language: Go
- Size: 190 KB
- Stars: 6
- Watchers: 7
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
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
}
```