Skip to content

Recorder

Services/Recorder — пример receiver bot. Он логинится как ClientType::Recorder, входит в конференцию, создает renderer sessions для remote devices и записывает media в файл.

Назначение

Recorder показывает, как писать клиентов, которые не публикуют свои устройства, а принимают чужие потоки: запись, аналитика, speech-to-text, AI observers, monitoring.

Запуск:

Recorder <server> <login> <password> <conference_tag> <path> <mp3Mode>

Пример из кода:

Recorder localhost:443 recorder 1 default ~/records/ 0

Entry point: Services/Recorder/Recorder.cpp.

Архитектура

flowchart TB
    Main[Recorder.cpp]
    Controller[Engine/Controller]
    Processor[Services/Recorder/Processor]
    MemberList[MemberList]
    RecorderCore[Record/Recorder]
    Audio[RendererAudioSession]
    Video[RendererVideoSession]

    Main --> Controller
    Main --> MemberList
    Main --> Processor
    Processor --> Controller
    Processor --> MemberList
    Processor --> RecorderCore
    Processor --> Audio
    Processor --> Video
    Audio --> RecorderCore
    Video --> RecorderCore

Lifecycle

sequenceDiagram
    participant Main
    participant P as Recorder Processor
    participant C as Controller
    participant S as Server
    participant R as Recorder core
    participant RS as RendererSession

    Main->>P: SetParams + Start
    P->>C: Connect(login/password, ClientType=Recorder)
    S-->>C: connect_response OK
    C-->>P: LogonSuccess
    P->>C: ConnectToConference(tag)
    S-->>C: connect_to_conference_response OK
    C-->>P: ConferenceConnected
    P->>R: Start(fileName, mp3Mode)
    S-->>C: device_connect remote camera/mic
    C-->>P: DeviceConnect
    P->>RS: create renderer, set codec/name/client/port
    P->>RS: Start(receiverSSRC, authorSSRC, deviceId, secureKey)
    RS-->>R: decoded audio/video frames

Remote device handling

Recorder обрабатывает DeviceConnect:

  • Camera и Demonstration создают RendererVideoSession;
  • Microphone создает RendererAudioSession;
  • устройства Consolidator пропускаются;
  • DeviceDisconnect удаляет соответствующую renderer session.
flowchart TB
    Event[DeviceConnect]
    Type{device_type}
    Video[RendererVideoSession]
    Audio[RendererAudioSession]
    Params[Set RTP params, codec, name, client_id]
    Start[Start receiver_ssrc/author_ssrc/device_id/secure_key]
    Record[Recorder writes MKV/MP3]

    Event --> Type
    Type -->|Camera/Demonstration| Video
    Type -->|Microphone| Audio
    Video --> Params --> Start --> Record
    Audio --> Params

Media pipeline

Video:

flowchart LR
    RTP[RTPSocket]
    Decrypt[Decryptor]
    Collect[VP8RTPCollector]
    Decode[VP8 Decoder]
    Rec[Recorder]

    RTP --> Decrypt --> Collect --> Decode --> Rec

Audio:

flowchart LR
    RTP[RTPSocket]
    Decrypt[Decryptor]
    Decode[Opus Decoder]
    Rec[Recorder]

    RTP --> Decrypt --> Decode --> Rec

Что копировать для своего receiver/AI observer

  1. Логиниться отдельным сервисным пользователем.
  2. Использовать ClientType::Recorder или другой согласованный тип.
  3. На ConferenceConnected запускать свой processing core.
  4. На каждый remote device_connect создавать session по типу устройства.
  5. Передавать в session receiverSSRC, authorSSRC, port, codec, secureKey.
  6. На device_disconnect обязательно останавливать и удалять session.
  7. На пустую конференцию можно отключаться через MemberList::CheckNoUsers().

Инварианты

  • Recorder не должен создавать capturer devices.
  • Один remote device соответствует одной renderer session.
  • receiverSSRC используется для приема потока.
  • authorSSRC нужен для RTCP/управляющих сообщений к автору.
  • Запись должна останавливаться при выходе из конференции или потере всех участников.