import type { Producer, ProducerCodecOptions } from 'mediasoup-client/lib/Producer'; import type { MediaKind, RtpCodecCapability } from 'mediasoup-client/lib/RtpParameters'; import type { AppData, RtpEncodingParameters } from 'mediasoup-client/lib/types'; import type { ParsedOutboundAudioStreamStats, ParsedOutboundVideoStreamStats } from 'webrtc-issue-detector'; import type LocalMutex from '../engine/LocalMutex'; import type Logger from '../engine/Logger'; import type Media from '../engine/media'; import type { AudioTrackProcessor } from '../engine/media/streamEffects/audio/AudioTrackProcessor'; import type { Effects } from '../engine/media/streamEffects/video/esdk/TrackProcessor'; import type MediaStreamTrackManager from '../engine/media/tracks/MediaStreamTrackManager'; import type { MyPeer } from '../engine/MyPeer'; import type Network from '../engine/network'; import type StatsHandler from '../engine/WebRTCStats/StatsHandler'; import type ProducerCloseManager from '../engine/media/producer/ProducerCloseManager'; import type EnhancedEventEmitter from '../EnhancedEventEmitter'; import type { MOSScores } from '../qoe/types'; import type { WIDStatsAdapter } from '../qoe/WIDStatsAdapter'; import type { ScoresCalculator } from '../qoe/ScoresCalculator'; import type { BaseTrackInfo, EncoderConfig, TrackLabel, TrackOutboundStats, TrackTransformParams } from './common'; import type { InternalObserverEvents } from './engine'; export interface BaseTrackDependenciesParams { internalEventEmitter: EnhancedEventEmitter; loggerFactory: (namespace: string) => Logger; media: Media; mediaStreamTrackManager: MediaStreamTrackManager; myPeer: MyPeer; network: Network; producerCloseManager: ProducerCloseManager; mutex: LocalMutex; statsHandler: StatsHandler; widStatsAdapter: WIDStatsAdapter; scoresCalculator: ScoresCalculator; } export interface BaseTrackParams { loggerNamespace: string; mediaStreamTrack: MediaStreamTrack; constraints: MediaStreamConstraints; } /** * Базовый контракт локального трека, которым управляет SDK. * * Через него приложение может публиковать медиа, ставить его на паузу, * получать техническую статистику и отслеживать состояние публикации. */ export interface BaseTrack { /** Набор событий трека, на которые можно подписаться из приложения. */ observer: EnhancedEventEmitter; mediaStreamTrack: MediaStreamTrack; id: string; kind: MediaKind; /** Показывает, опубликован ли трек в канале прямо сейчас. */ isPublished: boolean; /** Показывает, находится ли трек в paused-состоянии. */ isPaused: boolean; internalEventEmitter: EnhancedEventEmitter; producerId?: string; videoWebRTCStats?: ParsedOutboundVideoStreamStats; audioWebRTCStats?: ParsedOutboundAudioStreamStats; /** Текущие MOS-оценки качества для этого трека. */ connectionScores: MOSScores; getLabel: () => TrackLabel; setLabel: (label: TrackLabel) => void; setEncoderConfig: (encoderConfig: EncoderConfig) => void; getEncoderConfig: () => EncoderConfig; setProducer: (producer: Producer) => void; /** Управляет тем, будет ли исходный `MediaStreamTrack` остановлен при паузе или закрытии публикации. */ setStopTrackOnPause: (value: boolean) => void; getProducer: () => Producer | undefined; /** Явно останавливает исходный `MediaStreamTrack`, если приложению нужно освободить устройство. */ stopMediaStreamTrack: () => void; /** Закрывает producer, связанный с треком, без удаления самого объекта трека. */ closeProducer: (stopTrack?: boolean) => Promise; /** Меняет сетевой приоритет отправки этого трека. */ setPriority: (priority: RTCPriorityType) => Promise; /** Публикует трек в канале, чтобы он стал доступен другим участникам. */ publish: () => Promise; /** Снимает трек с публикации. */ unpublish: (stopTrack?: boolean) => Promise; /** Возобновляет передачу трека после паузы. */ resume: () => Promise; /** Возвращает сводную информацию о треке в формате, удобном для UI и отладки. */ getInfo: () => Promise; /** Возвращает техническую WebRTC-статистику опубликованного трека. */ getStats: () => Promise; /** Подменяет исходный `MediaStreamTrack` без пересоздания всего объекта трека. */ replaceTrack: (track: MediaStreamTrack) => Promise; } export interface TrackWithEncodings extends BaseTrack { getCodecOptions: () => ProducerCodecOptions; getEncodings: () => RtpEncodingParameters[]; getPreferredCodec: () => string; } export interface TrackWithEffects extends BaseTrack { isEffectsProcessing: boolean; } /** * Публичный контракт локального аудиотрека. */ export interface AudioTrack extends BaseTrack, TrackWithEncodings, TrackWithEffects { /** Подключает пользовательский процессор аудиотрека перед публикацией. */ setTrackProcessor: (trackProcessor?: AudioTrackProcessor) => void; /** Убирает ранее установленный пользовательский процессор аудио. */ unsetTrackProcessor: () => void; /** Включает шумоподавление для текущего микрофонного трека. */ enableNoiseSuppression: () => Promise; /** Отключает шумоподавление для текущего микрофонного трека. */ disableNoiseSuppression: () => Promise; /** Ставит аудиотрек на паузу без его удаления из SDK. */ pause: () => Promise; } /** * Дополнительные параметры публикации видеотрека. */ export interface VideoTrackPublishParams { /** Задержка перед запросом key frame после публикации или перепубликации трека. */ keyFrameRequestDelay?: number; } /** * Публичный контракт локального видеотрека. */ export interface VideoTrack extends BaseTrack, TrackWithEncodings, TrackWithEffects { /** Публикует видеотрек с дополнительными параметрами управления key frame. */ publish: (params?: VideoTrackPublishParams) => Promise; /** Обновляет прикладные параметры трансформации видео, например ожидаемый размер кадра. */ setTransformParams: (transformParams: object) => void; /** Ограничивает максимальный spatial layer для опубликованного видео. */ setMaxSpatialLayer: (spatialLayer: number) => Promise; /** Возвращает текущий верхний spatial layer, доступный для публикации. */ getMaxSpatialLayer: () => number | undefined; /** Включает движок видеоэффектов для трека. */ enableEffects: () => Promise; /** Отключает ранее включённые видеоэффекты. */ disableEffects: () => Promise; /** Применяет набор визуальных эффектов к текущему видеотреку. */ applyEffects: (effects: Effects) => Promise; /** Сбрасывает текущие визуальные эффекты к исходному состоянию. */ resetEffects: () => void; /** Регистрирует callback, который будет вызван после загрузки моделей движка эффектов. */ setOnLoadModels: (callback: () => void) => void; /** Прогресс загрузки моделей эффекторного движка от `0` до `1`. */ modelsLoadProgress: number; /** Ставит видеотрек на паузу без его удаления из SDK. */ pause: () => Promise; } /** * Универсальный тип локального трека, который может быть аудио- или видеотреком. */ export type Track = AudioTrack | VideoTrack; export type AudioTrackParams = BaseTrackParams; export interface MediaTracksFactory { createAudioTrack: (params: Omit) => BaseTrack; createVideoTrack: (params: Omit) => BaseTrack; } export type ProducerAppData = AppData & { peerId: string; label: TrackLabel; maxSpatialLayer: number; encodings?: RtpEncodingParameters[]; codecOptions?: ProducerCodecOptions; trackTransformParams?: TrackTransformParams; preferredCodec?: string; codec?: RtpCodecCapability; keyFrameRequestDelay?: number; }; /** * Параметры предварительной инициализации SDK видеоэффектов. * * Используются, когда приложение хочет подготовить blur, background replacement * и другие эффекты заранее, до первого вызова `videoTrack.enableEffects()`. */ export interface InitEffectsSDKParams { /** Идентификатор клиента, выданный провайдером эффекторного SDK. */ customerId?: string; /** Явный URL JavaScript-ресурсов эффекторного SDK. */ sdk_url?: string; /** Явный URL API эффекторного SDK. */ api_url?: string; /** Локальный каталог, из которого приложение раздаёт модели и WASM-ресурсы. */ localDir?: string; /** Версия пакета моделей и runtime-компонентов, которую нужно использовать. */ version?: string; }