UNPKG

trtc-electron-sdk

Version:

trtc electron sdk

479 lines (478 loc) 19.4 kB
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;