Skip to content

FilePlayer

Services/FilePlayer — пример publisher bot. Он логинится как обычный клиент, входит в конференцию и публикует файл как fake camera + fake microphone.

Назначение

FilePlayer полезен как reference для клиентов, которые не имеют UI, но создают собственные media devices: камеры, микрофоны, демонстрации, synthetic streams.

Запуск:

FilePlayer <server> <login> <password> <conference> <file>

Entry point: Services/FilePlayer/FilePlayer.cpp.

Архитектура

flowchart TB
    Main[FilePlayer.cpp]
    Controller[Engine/Controller]
    Processor[Services/FilePlayer/Processor]
    Player[Services/FilePlayer/Player]
    RTP[RTPSocket]
    Splitter[VP8RTPSplitter]

    Main --> Controller
    Main --> Processor
    Main --> Player
    Processor --> Controller
    Processor --> Player
    Player --> Splitter
    Player --> RTP
Компонент Ответственность
FilePlayer.cpp CLI, logger, signal handling, wiring.
Processor Event loop, login, conference join, create/delete devices.
Controller C++ control protocol client.
Player Чтение media file, RTP packetization, отправка audio/video.

Lifecycle

sequenceDiagram
    participant Main
    participant P as FilePlayer Processor
    participant C as Controller
    participant S as Server
    participant Player

    Main->>P: SetParams + Start
    P->>C: Connect(login/password, ClientType=Ordinal)
    S-->>C: connect_response OK
    C-->>P: LogonSuccess
    P->>C: ConnectToConference(tag)
    S-->>C: connect_to_conference_response OK
    C-->>P: ConferenceConnected
    P->>Player: Start()
    P->>C: CreateCapturer(Camera)
    P->>C: CreateCapturer(Microphone)
    S-->>C: device_connect my=1 camera
    C-->>P: CameraStarted(authorSSRC, port, secureKey)
    P->>Player: StartCamera(authorSSRC, secureKey)
    S-->>C: device_connect my=1 microphone
    C-->>P: MicrophoneStarted(authorSSRC, port, secureKey)
    P->>Player: StartMicrophone(authorSSRC, secureKey)

Что копировать для своего publisher

  1. Processor::Start() — запуск worker и controller.Connect(...).
  2. ConnectToConference() — вход в конференцию после LogonSuccess.
  3. StartCamera() / StartMicrophone() — создание capturer через CreateCapturer.
  4. Обработка CameraCreated / MicrophoneCreated — вызов ConnectCapturer.
  5. Обработка CameraStarted / MicrophoneStarted — получение authorSSRC, port, secureKey и старт RTP отправки.

Media details

FilePlayer использует native UDP path:

  • Player::SetCameraRTPParams(addr, port);
  • Player::SetMicrophoneRTPParams(addr, port);
  • Player::StartCamera(authorSSRC, secureKey);
  • Player::StartMicrophone(authorSSRC, secureKey).

Видео режется через VP8RTPSplitter, audio отправляется как Opus RTP. На входящие RTCP APP команды Player реагирует, например на ForceKeyFrame.

flowchart LR
    File[Media file]
    Demux[Player demux/decode]
    VP8[VP8 RTP splitter]
    Opus[Opus RTP packets]
    UDP[RTPSocket]
    Server[Server media translator]

    File --> Demux
    Demux --> VP8 --> UDP
    Demux --> Opus --> UDP
    UDP --> Server
    Server -->|RTCP ForceKeyFrame / ARC| UDP

Инварианты

  • FilePlayer публикует devices, но не должен принимать решение о device_id.
  • Media стартует только после device_connect my=1.
  • authorSSRC нужен для RTP отправки; port указывает media translator.
  • При остановке нужно удалить capturers и выйти из конференции.