trtc-electron-sdk
Version:
trtc electron sdk
479 lines (478 loc) • 19.4 kB
TypeScript
import { TRTCCameraCaptureParams, Rect, TRTCScreenCaptureProperty } from '../../trtc_define';
import { TRTCMediaSource, TRTCMediaMixingEncParam, ITRTCMediaMixingManager, TRTCPhoneMirrorParam, TRTCStreamLayout, TRTCOnlineVideoParam, TRTCVideoFileParam } from './types';
import { TRTCDeviceManager } from '../DeviceManager';
declare const NodeTRTCEngine: any;
/**
* @namespace TRTCMediaMixingEvent
* @description 目前只支持 `Windows` 操作系统
*/
export declare enum TRTCMediaMixingEvent {
/**
* @description 媒体源选中事件
*
* @event TRTCMediaMixingEvent#onSourceSelected
* @param {TRTCMediaInfo | null} mediaSource 新选中的媒体源数据,取消选中则为`null`
*/
onSourceSelected = "onSourceSelected",
/**
* @description 媒体源移动事件
*
* @event TRTCMediaMixingEvent#onSourceMoved
* @param {TRTCMediaInfo} mediaSource 被移动的媒体源
* @param {Rect} rect 移动后的位置、区域数据
*/
onSourceMoved = "onSourceMoved",
/**
* @description 媒体源尺寸变化事件
*
* @event TRTCMediaMixingEvent#onSourceResized
* @param {TRTCMediaInfo} mediaSource 尺寸变化的媒体源
* @param {Rect} rect 尺寸变化后的位置、区域数据
*/
onSourceResized = "onSourceResized",
/**
* @description 媒体源鼠标右键事件
*
* @event TRTCMediaMixingEvent#onRightButtonClicked
* @param {TRTCMediaInfo} mediaSource 鼠标右键点击的媒体源
* @param {Object} clickPoint 鼠标右键点击的位置
* @param {Number} clickPoint.windowX 鼠标右键点击相对窗口的 X 坐标
* @param {Number} clickPoint.windowY 鼠标右键点击相对窗口的 Y 坐标
* @param {Number} clickPoint.screenX 鼠标右键点击相对屏幕的 X 坐标
* @param {Number} clickPoint.screenY 鼠标右键点击相对屏幕的 Y 坐标
*/
onRightButtonClicked = "onRightButtonClicked",
/**
* @description 错误事件
*
* @event TRTCMediaMixingEvent#onError
* @param {TRTCMediaMixingErrorCode} errorCode 错误码
* @param {String} errorMessage 错误信息
* @param {TRTCMediaSource|undefined} 错误涉及的媒体源,可能为空
*
*/
onError = "onError",
/**
* @description 设备插入事件
*
* @event TRTCMediaMixingEvent#onSourcePlugged
* @param {TRTCPhoneMirrorParam} source 投屏手机状态信息
* @param {String} detail 投屏手机状态变化详情
*/
onSourcePlugged = "onSourcePlugged",
/**
* @description 设备链接事件
*
* @event TRTCMediaMixingEvent#onSourceConnected
* @param {TRTCPhoneMirrorParam} source 投屏手机状态信息
* @param {String} detail 投屏手机状态变化详情
*/
onSourceConnected = "onSourceConnected",
/**
* @description 设备断开链接事件
*
* @event TRTCMediaMixingEvent#onSourceDisconnected
* @param {TRTCPhoneMirrorParam} source 投屏手机状态信息
* @param {String} detail 投屏手机状态变化详情
*/
onSourceDisconnected = "onSourceDisconnected",
/**
* @description 设备拔出事件
*
* @event TRTCMediaMixingEvent#onSourceUnplugged
* @param {TRTCPhoneMirrorParam} source 投屏手机状态信息
* @param {String} detail 投屏手机状态变化详情
*/
onSourceUnplugged = "onSourceUnplugged",
/**
* @description 媒体源画面大小发生变化
*
* 当输入媒体源的画面大小发生变化时,会通过该接口返回该输入源最新的尺寸,您可以根据该尺寸来动态调整画面的比例。
* @event TRTCMediaMixingEvent#onMediaSourceSizeChanged
* @param {TRTCMediaSource} mediasource 媒体源信息
* @param {Object} size 媒体源最新的画面大小
* @param {Number} size.width 媒体源最新宽度
* @param {Number} size.height 媒体源最新高度
*/
onMediaSourceSizeChanged = "onMediaSourceSizeChanged",
onMediaMixingServerLost = "onMediaMixingServerLost"
}
declare enum TRTCMediaMixingServerMode {
Embedded = 0,
Independent = 1
}
/**
* 本地混流管理器
*
* 目前只支持 `Windows` 操作系统
*/
export declare class TRTCMediaMixingManager implements ITRTCMediaMixingManager {
private logPrefix;
private nodeMediaMixingPlugin;
private nodeTRTCCloud;
private deviceManager;
private eventEmitter;
private promiseStore;
private publishParams;
private mediaMixingDesigner;
private windowID;
private view;
private resizeObserver;
private previewRenderParams;
private mixingVideoWidth;
private mixingVideoHeight;
private sourceList;
private streamLayoutManager;
private trtcParamsStore;
private paramsStore;
private autoControlServer;
private serverStatus;
private serverMode;
private addMediaSourceTimers;
private webRenderer;
private pixelFormat;
private pixelLength;
private streamType;
private videoRenderBuffer;
constructor(options: {
deviceManager: TRTCDeviceManager;
nodeTRTCCloud: typeof NodeTRTCEngine.NodeRemoteTRTCCloud;
trtcParamsStore: Record<string, any>;
autoControlServer: boolean;
});
destroy(): Promise<void>;
/**
* @deprecated
* @private
* 设置视频流预览参数
*
* @param windowID {Number|Uint8Array} - 操作系统层的窗口 ID,Electron 下可以通过 Electron API [BrowserWindow.getNativeWindowHandle()]{@link https://www.electronjs.org/docs/latest/api/browser-window#wingetnativewindowhandle} 接口获取
* @param viewOrRegion {HTMLElement | Rect | null} - 本地混流视频显示位置
* - 传入 HTMLElement 元素,则 SDK 将本地混流视频显示在 HTMLElement 元素内,同时支持点击选中、移动、缩放媒体源,支持触发右键菜单事件。HTMLElement 元素必须是块元素。
* - 传入 Rect 显示区域,则 SDK 将本地混流视频显示在 Rect 指定区域内,不支持点击选中、移动、缩放媒体源,不支持触发右键菜单事件,这些功能您可以在 Web 页面中自行实现。
* - 传入 null 则 SDK 将停止显示本地混流视频。
*
* @example
* // Display in HTML Element
* import TRTCCloud from 'trtc-electron-sdk';
*
* const trtcCloud = TRTCCloud.getTRTCShareInstance({
* isIPCMode: true
* });
*
* const mediaMixingManager = trtcCloud.getMediaMixingManager();
*
* const windowID = 0; // Use Electron API BrowserWindow.getNativeWindowHandle()
* const previewDOM = document.getElementById("preview-local-mixed-media-stream");
* mediaMixingManager.setDisplayParams(windowID, previewDOM);
*
* @example
* // Display in a rectangle section
* import TRTCCloud from 'trtc-electron-sdk';
*
* const trtcCloud = TRTCCloud.getTRTCShareInstance({
* isIPCMode: true
* });
*
* const mediaMixingManager = trtcCloud.getMediaMixingManager();
*
* const windowID = 0; // Use Electron API BrowserWindow.getNativeWindowHandle()
* const previewDOM = document.getElementById("preview-local-mixed-media-stream");
* const domRect = previewDOM.getBoundingClientRect();
* const rect = {
* left: domRect.left * window.devicePixelRatio,
* right: domRect.right * window.devicePixelRatio,
* top: domRect.top * window.devicePixelRatio,
* bottom: domRect.bottom * window.devicePixelRatio
* };
*
* mediaMixingManager.setDisplayParams(windowID, rect);
*/
setDisplayParams(windowID: number | Uint8Array, viewOrRegion: HTMLElement | Rect | null): Promise<void>;
/**
* 设置视频流预览区域
*
* @param windowID {Uint8Array|Number} - 操作系统层的窗口 ID,Electron 下可以通过 Electron API [BrowserWindow.getNativeWindowHandle()]{@link https://www.electronjs.org/docs/latest/api/browser-window#wingetnativewindowhandle} 接口获取
* @param viewOrRegion {HTMLElement | Rect | null} - 本地混流视频显示位置
* - 传入 HTMLElement 元素,则 SDK 将本地混流视频显示在 HTMLElement 元素内,同时支持点击选中、移动、缩放媒体源,支持触发右键菜单事件。HTMLElement 元素必须是块元素。
* - 传入 Rect 显示区域,则 SDK 将本地混流视频显示在 Rect 指定区域内,不支持点击选中、移动、缩放媒体源,不支持触发右键菜单事件,这些功能您可以在 Web 页面中自行实现。
* - 传入 null 则 SDK 将停止显示本地混流视频。
*
* @example
* // Display in HTML Element
* import TRTCCloud from 'trtc-electron-sdk';
*
* const trtcCloud = TRTCCloud.getTRTCShareInstance({
* isIPCMode: true
* });
*
* const mediaMixingManager = trtcCloud.getMediaMixingManager();
*
* const windowID = 0; // Use Electron API BrowserWindow.getNativeWindowHandle()
* const previewDOM = document.getElementById("preview-local-mixed-media-stream");
* await mediaMixingManager.bindPreviewArea(windowID, previewDOM);
*
* @example
* // Display in a rectangle section
* import TRTCCloud from 'trtc-electron-sdk';
*
* const trtcCloud = TRTCCloud.getTRTCShareInstance({
* isIPCMode: true
* });
*
* const mediaMixingManager = trtcCloud.getMediaMixingManager();
*
* const windowID = 0; // Use Electron API BrowserWindow.getNativeWindowHandle()
* const previewDOM = document.getElementById("preview-local-mixed-media-stream");
* const domRect = previewDOM.getBoundingClientRect();
* const rect = {
* left: domRect.left * window.devicePixelRatio,
* right: domRect.right * window.devicePixelRatio,
* top: domRect.top * window.devicePixelRatio,
* bottom: domRect.bottom * window.devicePixelRatio
* };
*
* await mediaMixingManager.bindPreviewArea(windowID, rect);
*/
bindPreviewArea(windowID: Uint8Array | number, viewOrRegion: HTMLElement | Rect | null): Promise<void>;
/**
* 添加本地混流媒体源
* @param mediaSource {TRTCMediaSource} - 媒体源信息
* @returns {Promise<void>}
*/
addMediaSource(mediaSource: TRTCMediaSource): Promise<void>;
/**
* Returns the per-sourceType timeout (ms) used by addMediaSource. The
* defaults are intentionally larger than the cpp-layer timeout in
* SourceManagerProxy so that, in the normal case, the cpp side resolves the
* promise first. This JS timer is the last-resort safety net in case the
* cpp side itself fails to emit any callback (older builds, ipc lost, etc.).
*/
private getAddMediaSourceTimeoutMs;
/**
* 删除本地混流媒体源
* @param mediaSource {TRTCMediaSource} - 媒体源信息
* @returns {Promise<void>}
*/
removeMediaSource(mediaSource: TRTCMediaSource): Promise<void>;
private syncRemoveMediaSource;
private jsRemoveMediaSource;
/**
* 更新本地混流媒体源
* @param mediaSource {TRTCMediaSource} - 媒体源信息
* @returns {Promise<void>}
*/
updateMediaSource(mediaSource: TRTCMediaSource): Promise<void>;
/**
* 设置摄像头采集参数
* @param cameraID {string} - 摄像头 ID
* @param params {TRTCCameraCaptureParams} - 摄像头采集参数
*/
setCameraCaptureParam(cameraID: string, params: TRTCCameraCaptureParams): void;
/**
* 设置手机投屏参数
* @private
* @param phoneMirrorSourceId {string} - 手机投屏媒体源 ID
* @param param {TRTCPhoneMirrorParam} - 手机投屏参数
*/
setPhoneMirrorParam(phoneMirrorSourceId: string, param: TRTCPhoneMirrorParam): void;
/**
* 设置屏幕采集参数
* @param screenOrWindowID {String} - 屏幕 ID 或 窗口 ID
* @param property {TRTCScreenCaptureProperty} - 屏幕采集属性
*/
setScreenCaptureProperty(screenOrWindowID: string, property: TRTCScreenCaptureProperty): void;
/**
* 设置在线视频源播放参数
* @param url {string} - 在线视频源 URL
* @param param {TRTCOnlineVideoParam} - 在线视频源播放参数
*/
setOnlineVideoParam(url: string, param: TRTCOnlineVideoParam): void;
/**
* 设置视频文件播放参数
* @param videoFilePath {string} - 视频文件路径
* @param param {TRTCVideoFileParam} - 视频文件播放参数
*/
setVideoFileParam(videoFilePath: string, param: TRTCVideoFileParam): void;
/**
* 本地混流开始推流
* @returns {Promise<void>}
*/
startPublish(): Promise<void>;
/**
* 本地混流停止推流
* @returns {Promise<void>}
*/
stopPublish(): Promise<void>;
/**
* 更新本地混流编码参数
* @param params {TRTCMediaMixingEncParam} - 推流视频编码参数、背景色等参数
* @returns {Promise<void>}
*/
updatePublishParams(params: TRTCMediaMixingEncParam): Promise<void>;
/**
* 设置连麦视频流布局
*
* @param layout {TRTCStreamLayout} - 视频流布局信息
*
* @example
* // 设置自定义连麦布局
* import TRTCCloud, { TRTCStreamLayout, TRTCStreamLayoutMode, TRTCVideoFillMode } from 'trtc-electron-sdk';
*
* const trtcCloud = TRTCCloud.getTRTCShareInstance({
* isIPCMode: true
* });
*
* const mediaMixingManager = trtcCloud.getMediaMixingManager();
* if (mediaMixingManager) {
* const streamLayout: TRTCStreamLayout = {
* "layoutMode": TRTCStreamLayoutMode.Custom,
* "userList": [
* {
* "userId": "", // 本地用户 userId
* "rect": {
* "left": 0,
* "top": 0,
* "right": 296,
* "bottom": 494
* },
* "fillMode": TRTCVideoFillMode.TRTCVideoFillMode_Fill, // 视频填满显示区
* "zOrder": 0
* },
* {
* "userId": "849014",
* "rect": {
* "left": 296,
* "top": 0,
* "right": 592,
* "bottom": 247
* },
* "fillMode": TRTCVideoFillMode.TRTCVideoFillMode_Fill,
* "zOrder": 1
* },
* {
* "userId": "p20",
* "rect": {
* "left": 296,
* "top": 247,
* "right": 592,
* "bottom": 494
* },
* "fillMode": TRTCVideoFillMode.TRTCVideoFillMode_Fill,
* "zOrder": 2
* }
* ]
* };
* mediaMixingManager.setStreamLayout(streamLayout);
* }
*
* @example
* // 清除连麦布局,本地混流恢复居中填充显示(默认效果)
* import TRTCCloud, { TRTCStreamLayout, TRTCStreamLayoutMode, TRTCVideoFillMode } from 'trtc-electron-sdk';
*
* const trtcCloud = TRTCCloud.getTRTCShareInstance({
* isIPCMode: true
* });
*
* const mediaMixingManager = trtcCloud.getMediaMixingManager();
* if (mediaMixingManager) {
* const streamLayout: TRTCStreamLayout = {
* "layoutMode": TRTCStreamLayoutMode.None
* };
* mediaMixingManager.setStreamLayout(streamLayout);
* }
*/
setStreamLayout(layout: TRTCStreamLayout): void;
/**
* @private
* @deprecated
*/
setMediaServerPath(path?: string): Promise<void>;
/**
* @private
* 启动独立混流渲染进程
*
* 开发模式,默认路径:node_modules\\trtc-electron-sdk\\build\\Release\\liteav_media_server.exe
* 构建模式,默认路径:${resourcesPath}\\liteav_media_server.exe
*
* 如果用户应用有特殊配置,默认路径可能找不到服务进程程序,需要自行传入路径。
*
* @param path {string} - 混流渲染程序路径,不传入参数时,SDK 内部按照默认路径启动服务进程。
*
* @returns {Promise<void>}
*/
startMediaMixingServer(path?: string, mode?: TRTCMediaMixingServerMode): Promise<void>;
/**
* @private
* 关闭独立混流渲染进程
*
* @returns {Promise<void>}
*/
stopMediaMixingServer(): Promise<void>;
callExperimentalAPI(jsonStr: string): void;
/**
* 注册事件监听
*
* @param event {TRTCMediaMixingEvent} - 事件名称
* @param func {Function} - 事件回调函数
*/
on(event: TRTCMediaMixingEvent, func: (...args: any[]) => void): void;
/**
* 取消事件监听
*
* @param event {TRTCMediaMixingEvent} - 事件名
* @param func {Function} - 事件回调函数
*/
off(event: TRTCMediaMixingEvent, func: (...args: any[]) => void): void;
private createResizeObserver;
private destroyResizeObserver;
private onPreviewAreaResize;
private onVisibilityChange;
private setDisplayRect;
private calcHighlightColor;
private createDesigner;
private destroyDesigner;
private createOrUpdateLayoutManager;
private destroyLayoutManager;
private updateMixingVideoSize;
private updateSelectedBorderColor;
private listenDesignerEvent;
private unlistenDesignerEvent;
private onError;
private onSourceSelected;
private onSourceMoved;
private onSourceResized;
private onRightButtonClicked;
private isSameMediaSource;
private isMediaSourceExisted;
private findMediaSourceIndex;
private findSelectedMediaSource;
private unselectMediaSource;
private handleCppCallbackEvent;
private onMediaSourceAdded;
private onMediaSourceRemoved;
private onMediaSourceSizeChanged;
private onPhoneMirrorSourceChanged;
private onMediaServerState;
private onMediaMixingServerLost;
private onCallExperimentalAPIFinish;
private recoverMediaMixingServer;
private onDevicePixelRatioChange;
private previewInNativeWindow;
private previewInWebElement;
private previewInNone;
private createWebRenderer;
private destroyWebRenderer;
private createWebRendererBuffer;
private destroyWebRendererBuffer;
private webRendererCallback;
private renderMixedVideoFrame;
startCameraDeviceTest(windowID: number | Uint8Array, rect?: Rect): Promise<number>;
stopCameraDeviceTest(): Promise<number>;
setCameraTestRenderMirror(mirror: boolean): void;
setCameraTestDeviceId(cameraId: string): void;
setCameraTestResolution(width: number, height: number): void;
setCameraTestVideoPluginPath(path: string): void;
setCameraTestVideoPluginParameter(params: string): void;
}
export default TRTCMediaMixingManager;