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
Processor::Start()— запуск worker иcontroller.Connect(...).ConnectToConference()— вход в конференцию послеLogonSuccess.StartCamera()/StartMicrophone()— создание capturer черезCreateCapturer.- Обработка
CameraCreated/MicrophoneCreated— вызовConnectCapturer. - Обработка
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 и выйти из конференции.