{"id":22191821,"url":"https://github.com/bigbluebutton/bbb-webrtc-recorder","last_synced_at":"2025-07-26T22:31:38.295Z","repository":{"id":83903239,"uuid":"585284248","full_name":"bigbluebutton/bbb-webrtc-recorder","owner":"bigbluebutton","description":"Record ","archived":false,"fork":false,"pushed_at":"2024-02-21T13:40:22.000Z","size":195,"stargazers_count":6,"open_issues_count":0,"forks_count":4,"subscribers_count":7,"default_branch":"main","last_synced_at":"2024-10-29T13:24:17.364Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bigbluebutton.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-01-04T19:31:59.000Z","updated_at":"2024-08-19T15:34:32.000Z","dependencies_parsed_at":"2024-04-09T11:27:12.967Z","dependency_job_id":"80492082-4484-4af9-a5d6-7e7d1571b344","html_url":"https://github.com/bigbluebutton/bbb-webrtc-recorder","commit_stats":{"total_commits":47,"total_committers":3,"mean_commits":"15.666666666666666","dds":"0.21276595744680848","last_synced_commit":"b121d3caa4ff8101e4d9404247686913b1552fe3"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bigbluebutton%2Fbbb-webrtc-recorder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bigbluebutton%2Fbbb-webrtc-recorder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bigbluebutton%2Fbbb-webrtc-recorder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bigbluebutton%2Fbbb-webrtc-recorder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bigbluebutton","download_url":"https://codeload.github.com/bigbluebutton/bbb-webrtc-recorder/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227583201,"owners_count":17789504,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-02T12:17:54.664Z","updated_at":"2025-07-26T22:31:38.287Z","avatar_url":"https://github.com/bigbluebutton.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# bbb-webrtc-recorder\n\n### Installation\n\nInstall `.deb` package using `apt` or `apt-get`:\n\n```\napt update\napt install ./bbb-webrtc-recorder_x.x-x_amd64.deb\n```\n\nIt depends on `redis` package which will be installed automatically.\n\n### Configuration\n\nDefault configuration file:\n\n```\n/etc/bbb-webrtc-recorder/bbb-webrtc-recorder.yml\n```\n\n```yaml\nlog:\n  level: INFO  # TRACE, DEBUG, INFO, WARN, ERROR, FATAL\n\nrecorder:\n  # Directory where the recorder will save files\n  directory: /var/lib/bbb-webrtc-recorder\n  # File mode permissions for the recording directories (octal)\n  dirFileMode: 0700\n  # File mode permissions for the recording files (octal)\n  fileMode: 0700\n  # Whether to write to /dev/null instead of a file (for testing)\n  writeToDevNull: false\n  # Whether an IVF copy of WebM recordings should be generated\n  writeIVFCopy: false\n  # Write a stats file for each recording\n  writeStatsFile: false\n  videoPacketQueueSize: 256\n  audioPacketQueueSize: 32\n  useCustomSampler: true\n\npubsub:\n  channels:\n    # PubSub channel where the recorder will receive messages\n    subscribe: to-bbb-webrtc-recorder\n    # PubSub channel where the recorder will send messages\n    publish: from-bbb-webrtc-recorder\n  # The adapter which will be used for PubSub connection\n  adapter: redis\n  # PubSub adapter-specific configuration\n  adapters:\n    redis:\n      address: :6379\n      network: tcp\n      #password: foobared\n\nwebrtc:\n  # UDP port range to be used\n  rtcMinPort: 24577\n  rtcMaxPort: 32768\n  # Jitter Buffer size\n  jitterBuffer: 512\n  # List of IceServers used for RTC\n  iceServers:\n    - urls:\n        - stun:stun.l.google.com:19302\n# Example turn server\n#    - urls:\n#        - turn:turnserver.example.org:1234\n#      username: webrtc\n#      credential: turnpassword\n\n# HTTP server for testing\n# (should be disabled in production)\nhttp:\n  port: 8080\n  enable: true\n```\n\nDefault `env` file used by SystemD service:\n    * Note: all environment variables must be prefixed with `BBBRECORDER_`\n    * Note: all environment variables must be upper case\n    * Note: nested objects are separated by `_` (underscore)\n        - Example: `BBBRECORDER_RECORDER_DIRECTORY=/var/lib/bbb-webrtc-recorder` (equivalent of `recorder.directory` in config file)\n\n```\n/etc/default/bbb-webrtc-recorder\n```\n\nSystemd service:\n\n```\nsystemctl enable --now bbb-webrtc-recorder\nsystemctl status bbb-webrtc-recorder\n```\n\nMake sure to start `redis`:\n\n```\nsystemctl enable --now redis\nsystemctl status redis\n```\n\n### Debugging\n\nExamples of how to print out config values:\n\n```\nbbb-webrtc-recorder [-c config.yml] --dump http\nbbb-webrtc-recorder [-c config.yml] --dump http.port\nbbb-webrtc-recorder [-c config.yml] --dump recorder.directory\n```\n\nViewing SystemD logs:\n\n```\njournalctl -u bbb-webrtc-recorder -f\n```\n\n### PubSub events/calls\n\n`startRecording` (SFU -\u003e Recorder)\n\n```json5\n{\n    id: 'startRecording',\n    recordingSessionId: \u003cString\u003e, // requester-defined - error out if collision\n    fileName: \u003cString\u003e, // file name INCLUDING format (.webm)\n    adapter: \u003cString\u003e, // \"mediasoup\" or \"livekit\" - defaults to \"mediasoup\" if not specified\n    adapterOptions: {\n        // mediasoup-specific options\n        mediasoup?: {\n            sdp: \u003cString\u003e, // required for mediasoup adapter if legacy sdp is not provided\n        },\n        // LiveKit-specific options\n        livekit?: {\n            room: \u003cString\u003e, // required for livekit adapter\n            trackIds: \u003cString[]\u003e, // required for livekit adapter - array of track IDs to record\n        }\n    },\n    // Legacy field for backward compatibility\n    sdp?: \u003cString\u003e, // offer - required for mediasoup adapter if adapterOptions.mediasoup.sdp is not provided\n}\n```\n\n`startRecordingResponse` (Recorder -\u003e SFU)\n\n```json5\n{\n    id: \"startRecordingResponse\",\n    recordingSessionId: \u003cString\u003e, // file name,\n    status: \"ok\" | \"failed\",\n    error: undefined | \u003cString\u003e,\n    sdp: \u003cString | undefined\u003e, // answer\n    fileName: \u003cString | undefined\u003e, // full path to recording\n}\n```\n\n`recordingRtpStatusChanged` (Recorder -\u003e SFU)\n\n```json5\n{\n    id: \"recordingRtpStatusChanged\", // media started or stopped flowing\n    status: \"flowing\" | \"not_flowing\",\n    recordingSessionId: \u003cString\u003e, // file name\n    timestampUTC: \u003cNumber\u003e, // latest/trigger frame ts, UTC\n    timestampHR: \u003cNumber\u003e, //monotonic system time (latest/trigger frame ts),\n}\n```\n\n`stopRecording` (SFU -\u003e Recorder)\n\n```json5\n{\n    id: \"stopRecording\",\n    recordingSessionId: \u003cString\u003e, // file name\n}\n```\n\n`recordingStopped` (Recorder -\u003e SFU)\n\n```json5\n{\n    id: \"recordingStopped\",\n    recordingSessionId: \u003cString\u003e, // file name\n    reason: \u003cString\u003e,\n    timestampUTC: \u003cNumber\u003e, // last written frame timestamp, UTC, wall clock\n    timestampHR:  \u003cNumber\u003e // last written frame timestamp, monotonic system time\n}\n```\n\n`getRecorderStatus` (* -\u003e Recorder)\n```JSON5\n{\n\tid: 'getRecorderStatus',\n}\n```\n\n`recorderStatus` (Recorder -\u003e *)\n\n```JSON5\n{\n\tid: 'recorderStatus', // Triggered by getRecorderStatus\n\tappVersion: \u003cString\u003e, // version of the recorder\n\tinstanceId: \u003cString\u003e, // unique instance id\n\ttimestamp: \u003cNumber\u003e, // event generation timestamp\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbigbluebutton%2Fbbb-webrtc-recorder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbigbluebutton%2Fbbb-webrtc-recorder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbigbluebutton%2Fbbb-webrtc-recorder/lists"}