UNPKG

trtc-electron-sdk

Version:

trtc electron sdk

602 lines (601 loc) 29.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TRTCLocalMediaTranscodingSourceType = exports.TRTCLocalMediaTranscodingEvents = exports.TRTCLocalMediaTranscodingError = void 0; const events_1 = require("events"); const trtc_define_1 = require("../trtc_define"); const Renderer_1 = require("../Renderer"); const logger_1 = __importDefault(require("../logger")); /** * @description 本地媒体流混流转码错误码 * @enum {Number} */ const TRTCLocalMediaTranscodingError_HACK_JSDOC = { /** 调用成功。 */ Success: 0, /** 通用错误码。 */ Error: -1, /** 参数非法。 */ InvalidParams: -2, /** 数据源混流异常,数据源超过 30 秒没数据。 */ NotFoundSource: -3, /** 图片源加载失败。*/ ImageSourceLoadFailed: -4, }; var TRTCLocalMediaTranscodingError; (function (TRTCLocalMediaTranscodingError) { TRTCLocalMediaTranscodingError[TRTCLocalMediaTranscodingError["Success"] = 0] = "Success"; TRTCLocalMediaTranscodingError[TRTCLocalMediaTranscodingError["Error"] = -1] = "Error"; TRTCLocalMediaTranscodingError[TRTCLocalMediaTranscodingError["InvalidParams"] = -2] = "InvalidParams"; TRTCLocalMediaTranscodingError[TRTCLocalMediaTranscodingError["NotFoundSource"] = -3] = "NotFoundSource"; TRTCLocalMediaTranscodingError[TRTCLocalMediaTranscodingError["ImageSourceLoadFailed"] = -4] = "ImageSourceLoadFailed"; })(TRTCLocalMediaTranscodingError = exports.TRTCLocalMediaTranscodingError || (exports.TRTCLocalMediaTranscodingError = {})); /** * @namespace TRTCLocalMediaTranscodingEvent * @description 目前只支持 Windows */ var TRTCLocalMediaTranscodingEvents; (function (TRTCLocalMediaTranscodingEvents) { /** * @description 本地混流转码开启的事件 * * 当您调用 [startTranscoding]{@link TRTCLocalMediaTranscoder#startTranscoding} 时启动本地混流转码时,是否启动成功会通过此回调同步给您。 * * @event TRTCLocalMediaTranscodingEvent#onTranscodingStarted * @param {TRTCLocalMediaTranscodingError} errCode - 错误码。 * @param {String} errMsg - 错误信息。 */ TRTCLocalMediaTranscodingEvents["onTranscodingStarted"] = "onTranscodingStarted"; /** * @description 本地混流转码停止的事件 * * 当您通过 [stopTranscoding]{@link TRTCLocalMediaTranscoder#stopTranscoding} 停止本地混流转码时,SDK 便会抛出此事件。 * * @event TRTCLocalMediaTranscodingEvent#onTranscodingStopped * @param {Number} reason - 停止原因,0:用户主动停止;1:被动停止,有可能采集源失效了 * @param {String} errMsg - 停止原因描述信息。 */ TRTCLocalMediaTranscodingEvents["onTranscodingStopped"] = "onTranscodingStopped"; /** * @description 本地摄像头开启的事件 * 当您调用 [startCameraSource]{@link TRTCLocalMediaTranscoder#startCameraSource} 打开摄像头时,是否启动成功会通过此回调同步给您。 * * @event TRTCLocalMediaTranscodingEvent#onCameraSourceStarted * @param {String} deviceId - 摄像头设备 Id 。 * @param {TRTCLocalMediaTranscodingError} errCode - 错误码。 * @param {String} errMsg - 错误信息。 */ TRTCLocalMediaTranscodingEvents["onCameraSourceStarted"] = "onCameraSourceStarted"; /** * @description 本地摄像头停止的事件 * * @event TRTCLocalMediaTranscodingEvent#onCameraSourceStopped * @param {String} deviceId - 摄像头设备 Id 。 * @param {String} reasonMsg - 停止原因描述信息。 */ TRTCLocalMediaTranscodingEvents["onCameraSourceStopped"] = "onCameraSourceStopped"; /** * @description 图片混流开启的事件 * 当您调用 [addImageSource]{@link TRTCLocalMediaTranscoder#addImageSource} 打开摄像头时,是否启动成功会通过此回调同步给您。 * * @event TRTCLocalMediaTranscodingEvent#onImageSourceStarted * @param {String} imagePath - 图片路径 。 * @param {TRTCLocalMediaTranscodingError} errCode - 错误码。 * @param {String} errMsg - 错误信息。 */ TRTCLocalMediaTranscodingEvents["onImageSourceStarted"] = "onImageSourceStarted"; /** * @description 图片混流停止的事件 * @event TRTCLocalMediaTranscodingEvent#onImageSourceStopped * @param {String} imagePath - 图片路径 。 */ TRTCLocalMediaTranscodingEvents["onImageSourceStopped"] = "onImageSourceStopped"; /** * @description 屏幕分享开启的事件 * * 当您通过 [startScreenSource]{@link TRTCLocalMediaTranscoder#startScreenSource} 等相关接口启动屏幕分享时,SDK 便会抛出此事件回调。 * * @event TRTCLocalMediaTranscodingEvent#onScreenSourceStarted * @param {String} sourceId - 屏幕或者窗口 Id 。 * @param {TRTCLocalMediaTranscodingError} errCode - 错误码。 * @param {String} errMsg - 错误信息。 */ TRTCLocalMediaTranscodingEvents["onScreenSourceStarted"] = "onScreenSourceStarted"; /** * @description 屏幕分享暂停的事件 * @event TRTCLocalMediaTranscodingEvent#onScreenSourcePaused * @param {String} sourceId - 屏幕或者窗口 Id 。 * @param {int} reason - 原因: * - 1:注意此字段的含义在 MAC 和 Windows * 平台有稍微差异。屏幕窗口不可见暂停(Mac)。表示设置屏幕分享参数导致的暂停(Windows)。 * - 2:表示屏幕分享窗口被最小化导致的暂停(仅 Windows)。 * - 3:表示屏幕分享窗口被隐藏导致的暂停(仅 Windows)。 */ TRTCLocalMediaTranscodingEvents["onScreenSourcePaused"] = "onScreenSourcePaused"; /** * @description 屏幕分享恢复的事件 * @event TRTCLocalMediaTranscodingEvent#onScreenSourceResumed * @param {String} sourceId - 屏幕或者窗口 Id 。 * @param {int} reason - 原因: * - 1:注意此字段的含义在 MAC 和 Windows * 平台有稍微差异。屏幕窗口恢复可见从而恢复分享(Mac)。屏幕分享参数设置完毕后自动恢复(Windows)。 * - 2:表示屏幕分享窗口从最小化被恢复(仅 Windows)。 * - 3:表示屏幕分享窗口从隐藏被恢复(仅 Windows)。 */ TRTCLocalMediaTranscodingEvents["onScreenSourceResumed"] = "onScreenSourceResumed"; /** * @description 屏幕分享停止的事件 * 当您通过 [stopScreenSource]{@link TRTCLocalMediaTranscoder#stopScreenSource} 停止屏幕分享时,SDK 便会抛出此事件回调。 * * @event TRTCLocalMediaTranscodingEvent#onScreenSourceStopped * @param {String} sourceId - 屏幕或者窗口 Id 。 * @param {int} reason - 原因:0:用户主动停止;1:屏幕窗口关闭导致停止;2:表示屏幕分享的显示屏状态变更(如接口被拔出、投影模式变更等)。 */ TRTCLocalMediaTranscodingEvents["onScreenSourceStopped"] = "onScreenSourceStopped"; })(TRTCLocalMediaTranscodingEvents = exports.TRTCLocalMediaTranscodingEvents || (exports.TRTCLocalMediaTranscodingEvents = {})); /** * 媒体源类型 * @enum {Number} */ const TRTCLocalMediaTranscodingSourceType_HACK_JSDOC = { /** 摄像头媒体类型 */ MediaSourceCamera: 0, /** 屏幕媒体类型 */ MediaSourceScreen: 1, /** 图片媒体类型,目前只支持 BMP、JPG、PNG、GIF 四种格式 */ MediaSourceImage: 2, /** 预留字段,当前版本不支持远端用户视频源混流转码 */ MediaSourceRemoteVideo: 3 }; var TRTCLocalMediaTranscodingSourceType; (function (TRTCLocalMediaTranscodingSourceType) { TRTCLocalMediaTranscodingSourceType[TRTCLocalMediaTranscodingSourceType["MediaSourceCamera"] = 0] = "MediaSourceCamera"; TRTCLocalMediaTranscodingSourceType[TRTCLocalMediaTranscodingSourceType["MediaSourceScreen"] = 1] = "MediaSourceScreen"; TRTCLocalMediaTranscodingSourceType[TRTCLocalMediaTranscodingSourceType["MediaSourceImage"] = 2] = "MediaSourceImage"; TRTCLocalMediaTranscodingSourceType[TRTCLocalMediaTranscodingSourceType["MediaSourceRemoteVideo"] = 3] = "MediaSourceRemoteVideo"; })(TRTCLocalMediaTranscodingSourceType = exports.TRTCLocalMediaTranscodingSourceType || (exports.TRTCLocalMediaTranscodingSourceType = {})); /** * 媒体源 * @namespace TRTCLocalMediaTranscoding * @typedef {Object} TRTCLocalMediaTranscodingSource - 媒体源 * @property {TRTCLocalMediaTranscodingSourceType} mode - 【字段含义】媒体类型。 * @property {String} cameraDeviceId * 【字段含义】摄像头 ID<br/> * 当 sourceType 为 TRTCMediaSourceCamera 时此字段有效,您可以使用该字段指定摄像头的设备 * ID,摄像头的设备 ID 可以通过 TRTCCloud 的 getCameraDevicesList() 接口获取 * @property {String} screenSourceId * 【字段含义】屏幕或窗口 ID<br/> * 当 sourceType 为 TRTCMediaSourceCamera 时此字段有效,您可以使用该字段指定整个屏幕或者某个窗口的窗口 ID。 * 您可以通过 TRTCCloud 中的 getScreenCaptureSources 接口获取可以被分享的窗口 ID。 * @property {String} imagePath * 【字段含义】图像的地址<br/> * 当 sourceType 为 TRTCMediaSourceCamera 时此字段有效,您可以使用该字段指定图片的文件路径,目前版本只支持 BMP、JPG、PNG、GIF 四种图像格式。 * @property {String} userId * 【字段含义】远端视频流的用户 ID<br/> * 当 sourceType 为 TRTCMediaSourceCamera 时此字段有效,不过当前版本的 SDK 还不支持这个能力。 * @property {Rect} rect - 【字段含义】指定该路画面的坐标区域(单位:像素)。 * @property {Number} zOrder - 【字段含义】指定该路画面的层级(取值范围:0 - 15,不可重复)。 * @property {TRTCRenderParams} renderParams - 【字段含义】指定该路数据源是否旋转、镜像和填充模式。 */ const TRTCLocalMediaTranscodingSource_HACK_JSDOC = null; /** * 本地媒体流混流转码配置参数 * @typedef {Object} TRTCLocalMediaTranscodingParams - 本地媒体流混流转码配置参数 * @property {Array<TRTCLocalMediaTranscodingSource>} inputSourceList * 【字段含义】指定转码流中的每一路输入媒体源配置的信息。<br/> * 【推荐取值】该字段是一个 TRTCLocalMediaTranscodingSource 类型的数组,数组中的每一个元素都用来代表每一路输入媒体源的信息。<br/> * 【特别说明】媒体源信息不支持留空,否则 TRTCLocalMediaTranscoder 的 onTranscodingStarted 会报错。 * * @property {TRTCVideoEncParam} videoEncoderParams * 【字段含义】转码流的视频编码参数。 * * @property {Number} canvasColor * 【字段含义】指定混合画面的底色。<br/> * 【推荐取值】默认值:0x000000 代表黑色。格式为十六进制数字,比如:“0x61B9F1” 代表 RGB 分别为(97、158、241)。 */ const TRTCLocalMediaTranscodingParams_HACK_JSDOC = null; /** * @description 本地媒体流混流转码(目前只支持 Windows) * * @extends EventEmitter * * @example * // 运行示例 * import TRTCCloud, { * TRTCCameraCaptureMode, * TRTCVideoRotation, * TRTCVideoFillMode, * TRTCVideoMirrorType, * TRTCVideoStreamType, * TRTCLocalMediaTranscodingSourceType, * TRTCVideoResolution, * TRTCVideoResolutionMode, * TRTCVideoPixelFormat * } from 'trtc-electron-sdk'; * * const trtcCloud = TRTCCloud.getTRTCShareInstance(); * const cameraList =trtcCloud.getCameraDevicesList(); * * // 获取本地合图转码推流对象 * const localMediaTranscoder =trtcCloud.createLocalMediaTranscoder({ * pixelFormat: TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420, * }); * * // 注册事件监听 * // 监听合图开始、结束事件 * localMediaTranscoder.on('onTranscodingStarted', (errCode: number, errMsg: string) => { * console.log(`onTranscodingStarted { errCode:${errCode} errMsg:${errMsg}`); * }); * localMediaTranscoder.on('onTranscodingStopped', (reason: number, reasonMsg: string) => { * console.log(`onTranscodingStopped { reason:${reason} reasonMsg:${reasonMsg} }`); * }); * // 监听摄像头事件 * localMediaTranscoder.on('onCameraSourceStarted', (deviceId: string, errCode: number, errMsg: string) => { * console.log(`onCameraSourceStarted { deviceId:${deviceId} errCode:${errCode} errMsg:${errMsg} }`); * }); * localMediaTranscoder.on('onCameraSourceStopped', (deviceId: string, reasonMsg: string) => { * console.log(`onCameraSourceStopped { deviceId:${deviceId} reasonMsg:${reasonMsg}}`); * }); * // 监听屏幕、窗口分享事件 * localMediaTranscoder.on('onScreenSourceStarted', (sourceId: string, errCode: number, errMsg: string) => { * console.log(`onScreenSourceStarted { sourceId:${sourceId} errCode:${errCode} errMsg:${errMsg} }`); * }); * localMediaTranscoder.on('onScreenSourceStopped', (sourceId: string, reason: number) => { * console.log(`onScreenSourceStopped { sourceId:${sourceId}, reason:${reason} }`); * }); * // 监听图片事件 * localMediaTranscoder.on('onImageSourceStarted', (imagePath: string, errCode: number, errMsg: string) => { * console.log(`onImageSourceStarted { imagePath:${imagePath} errCode:${errCode} errMsg:${errMsg} }`); * }); * localMediaTranscoder.on('onImageSourceStopped', (imagePath: string) => { * console.log(`onImageSourceStopped { imagePath:${imagePath} }`); * }); * * // 开启摄像头一 * localMediaTranscoder.startCameraSource(cameraList[0].deviceId); * localMediaTranscoder.setCameraCaptureParams( * cameraList[0].deviceId, * { * mode: TRTCCameraCaptureMode.TRTCCameraResolutionStrategyAuto, * width: 480, * height: 480, * } * ); * * // 开启摄像头二 * localMediaTranscoder.startCameraSource(cameraList[1].deviceId); * localMediaTranscoder.setCameraCaptureParams( * cameraList[1].deviceId, * { * mode: TRTCCameraCaptureMode.TRTCCameraResolutionStrategyAuto, * width: 960, * height: 540 * } * ); * * * // 开启屏幕一 * localMediaTranscoder.startScreenSource(screenSourceList[0], {top:10, left:10, right:1200, bottom:800}); * * // 开启屏幕二 * localMediaTranscoder.startScreenSource(screenSourceList[1], {top:0, left:0, right:0, bottom:0}); * * // 加载图片一 * localMediaTranscoder.addImageSource('<please set valid image path>', 15); * * // 加载图片二 * localMediaTranscoder.addImageSource('<please set valid image path>', 15); * * // 启动合图转码并推流 * localMediaTranscoder.startTranscoding( * TRTCVideoStreamType.TRTCVideoStreamTypeBig, * { * inputSourceList: [ * { // camera 1 * sourceType: TRTCLocalMediaTranscodingSourceType.MediaSourceCamera, * cameraDeviceId: cameraList[0].deviceId, * rect: { left: 0, top: 0, right: 320, bottom: 180 }, * zOrder: 1, * renderParams: { * rotation: TRTCVideoRotation.TRTCVideoRotation0, * fillMode: TRTCVideoFillMode.TRTCVideoFillMode_Fit, * mirrorType: TRTCVideoMirrorType.TRTCVideoMirrorType_Disable * }, * }, * { // camera 2 * sourceType: TRTCLocalMediaTranscodingSourceType.MediaSourceCamera, * cameraDeviceId: cameraList[1].deviceId, * rect: {left: 320 + 20, top: 180 + 20, right: 640 + 20, bottom: 360 + 20}, * zOrder: 2, * renderParams: { * rotation: TRTCVideoRotation.TRTCVideoRotation90, * fillMode: TRTCVideoFillMode.TRTCVideoFillMode_Fill, * mirrorType: TRTCVideoMirrorType.TRTCVideoMirrorType_Enable * }, * }, * { * // screen 1 * sourceType: TRTCLocalMediaTranscodingSourceType.MediaSourceScreen, * screenSourceId: screenSourceList[0].sourceId, * rect: {left: 320 + 20, top: 0, right: 640 + 20, bottom: 180}, * zOrder: 3, * renderParams: { * rotation: TRTCVideoRotation.TRTCVideoRotation180, * fillMode: TRTCVideoFillMode.TRTCVideoFillMode_Fit, * mirrorType: TRTCVideoMirrorType.TRTCVideoMirrorType_Enable * }, * }, * { * // screen 2 * sourceType: TRTCLocalMediaTranscodingSourceType.MediaSourceScreen, * screenSourceId: screenSourceList[1].sourceId, * rect: {left: 0, top: 180 + 20, right: 320, bottom: 360 + 20}, * zOrder: 4, * renderParams: { * rotation: TRTCVideoRotation.TRTCVideoRotation270, * fillMode: TRTCVideoFillMode.TRTCVideoFillMode_Fill, * mirrorType: TRTCVideoMirrorType.TRTCVideoMirrorType_Auto * }, * }, * { // image 1 * sourceType: TRTCLocalMediaTranscodingSourceType.MediaSourceImage, * imagePath: '<please set valid image path>', * rect: {left: 0, top: 360 + 40, right: 320, bottom: 540 + 40}, * zOrder: 5, * renderParams: { * rotation: TRTCVideoRotation.TRTCVideoRotation90, // 不会生效,参数设置将被忽略 * fillMode: TRTCVideoFillMode.TRTCVideoFillMode_Fit, * mirrorType: TRTCVideoMirrorType.TRTCVideoMirrorType_Enable // 不会生效,参数设置将被忽略 * }, * }, * { // image 2 * sourceType: TRTCLocalMediaTranscodingSourceType.MediaSourceImage, * imagePath: '<please set valid image path>', * rect: {left: 320 + 20, top: 360 + 40, right: 640, bottom: 540 + 40}, * zOrder: 5, * renderParams: { * rotation: TRTCVideoRotation.TRTCVideoRotation0, // 不会生效,参数设置将被忽略 * fillMode: TRTCVideoFillMode.TRTCVideoFillMode_Fill, * mirrorType: TRTCVideoMirrorType.TRTCVideoMirrorType_Disable // 不会生效,参数设置将被忽略 * }, * } * ], * videoEncoderParams: { * videoResolution: TRTCVideoResolution.TRTCVideoResolution_960_720, * resMode: TRTCVideoResolutionMode.TRTCVideoResolutionModeLandscape, * videoFps: 30, * videoBitrate: 800, * minVideoBitrate: 0, * enableAdjustRes: false, * }, * canvasColor: 0xff0000, // 0x61b9f1, * } * ); * * // 设置本地预览 * const view = document.getElementById("preview-view"); * localMediaTranscoder.setMixedVideoRenderView(view as HTMLElement); */ class TRTCLocalMediaTranscoder extends events_1.EventEmitter { constructor(nativeLocalMediaTranscoder, pixelFormat) { super(); this.nativeLocalMediaTranscoder = nativeLocalMediaTranscoder; this.renderer = null; this.container = null; this.pixelFormat = pixelFormat || trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420; this.setEventCallback(); this.nativeLocalMediaTranscoder.setVideoFrameProcessCallback(this.pixelFormat); } destroy() { var _a; try { if (this.nativeLocalMediaTranscoder) { // 避免重复销毁报错 this.nativeLocalMediaTranscoder.setVideoFrameRenderCallback(null, this.pixelFormat); this.nativeLocalMediaTranscoder.setVideoFrameProcessCallback(trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_Unknown); this.nativeLocalMediaTranscoder = null; } (_a = this.renderer) === null || _a === void 0 ? void 0 : _a.destroy(); this.renderer = null; this.container = null; } catch (error) { logger_1.default.warn('TRTCLocalMediaTranscoder.destroy error', error); } } // 帧率、码率在 JS 层为数值,可能被设置为负数,底层要求为无符号整数,此处做检验并将负值设置为零 validateTranscodingConfig(params) { if (params.videoEncoderParams.videoFps < 0) { params.videoEncoderParams.videoFps = 0; } if (params.videoEncoderParams.videoBitrate < 0) { params.videoEncoderParams.videoBitrate = 0; } if (params.videoEncoderParams.minVideoBitrate < 0) { params.videoEncoderParams.minVideoBitrate = 0; } } /** * 启动本地混流转码 * * @param streamType {TRTCVideoStreamType} - 指定使用 TRTC 的 TRTCVideoStreamTypeBig 来推流,还是 TRTCVideoStreamTypeSub 来推流。 * @param params {TRTCLocalMediaTranscodingParams} - 指定本地混流转码的参数 * @param params.inputSourceList {TRTCLocalMediaTranscodingSource} - 【字段含义】指定转码流中的每一路输入媒体源配置的信息。 * -【推荐取值】该字段是一个 TRTCLocalMediaTranscodingSource 类型的数组,数组中的每一个元素都用来代表每一路输入媒体源的信息。 * -【特别说明】媒体源信息不支持留空,否则 TRTCLocalMediaTranscoder 的 onTranscodingStarted 会报错。 * @param params.videoEncoderParams {TRTCVideoEncParam} -【字段含义】转码流的视频编码参数 * @param params.canvasColor {Number} - 【字段含义】指定混合画面的底色。 * -【推荐取值】默认值:0x000000 代表黑色。格式为十六进制数字,比如:“0x61B9F1” 代表 RGB 分别为(97、158、241)。 * * @fires [onTranscodingStarted]{@link TRTCLocalMediaTranscodingEvent#onTranscodingStarted} */ startTranscoding(streamType, params) { this.validateTranscodingConfig(params); this.nativeLocalMediaTranscoder.startTranscoding(streamType, params); } /** * 更新本地混流转码参数 * * @param params {TRTCLocalMediaTranscodingParams} - 指定本地混流转码的参数 */ updateTranscodingParams(params) { this.validateTranscodingConfig(params); this.nativeLocalMediaTranscoder.updateTranscodingParams(params); } /** * 停止本地混流转码 * * @fires [onTranscodingStopped]{@link TRTCLocalMediaTranscodingEvent#onTranscodingStopped} */ stopTranscoding() { this.nativeLocalMediaTranscoder.stopTranscoding(); } /** * 启动摄像头采集 * * @param deviceId {String} - 摄像头设备 Id * * @fires [onCameraSourceStarted]{@link TRTCLocalMediaTranscodingEvent#onCameraSourceStarted} */ startCameraSource(deviceId) { this.nativeLocalMediaTranscoder.startCameraSource(deviceId); } /** * 设置摄像头采集参数 * * @param deviceId {String} - 摄像头设备 Id * @param cameraCaptureParams {TRTCCameraCaptureParams} - 指定摄像头采集分辨率和帧率 */ setCameraCaptureParams(deviceId, cameraCaptureParams) { this.nativeLocalMediaTranscoder.setCameraCaptureParams(deviceId, cameraCaptureParams); } /** * 停止摄像头采集 * @param deviceId {String} - 摄像头设备 Id * * @fires [onCameraSourceStopped]{@link TRTCLocalMediaTranscodingEvent#onCameraSourceStopped} */ stopCameraSource(deviceId) { this.nativeLocalMediaTranscoder.stopCameraSource(deviceId); } /** * 启动屏幕/窗口采集 * * @param source {TRTCScreenCaptureSourceInfo} - 屏幕/窗口采集的详细参数 * @param rect {Rect} - 指定捕获的区域 * * @fires [onScreenSourceStarted]{@link TRTCLocalMediaTranscodingEvent#onScreenSourceStarted} */ startScreenSource(source, rect) { this.nativeLocalMediaTranscoder.startScreenSource(source, rect); } /** * 停止屏幕/窗口采集 * @param sourceId {String} - 屏幕/窗口的 Id * * @fires [onScreenSourceStopped]{@link TRTCLocalMediaTranscodingEvent#onScreenSourceStopped} */ stopScreenSource(sourceId) { this.nativeLocalMediaTranscoder.stopScreenSource(sourceId); } /** * 启动图片采集 * @param path {String} - 图片路径 ,目前只支持 BMP、JPG、PNG、GIF 四种格式 * @param fps {Number} - 采集输出帧率,可以不设置由 SDK 做最佳决策 * * @fires [onImageSourceStarted]{@link TRTCLocalMediaTranscodingEvent#onImageSourceStarted} */ addImageSource(path, fps) { this.nativeLocalMediaTranscoder.addImageSource(path, fps); } /** * 停止图片采集 * @param path {String} - 图片路径 * * @fires [onImageSourceStopped]{@link TRTCLocalMediaTranscodingEvent#onImageSourceStopped} */ removeImageSource(path) { this.nativeLocalMediaTranscoder.removeImageSource(path); } /** * 设置本地混流转码视频预览节点 * @param view {HTMLElement | null} - 如果传入的是 HTML 元素,必须是块元素;传入 null 时,会停止视频预览 */ setMixedVideoRenderView(view) { if (view && view instanceof HTMLElement) { if (this.container === view) { return; // 重复在同一个 HTML 节点内渲染,不用处理,直接退出 } else if (this.renderer) { // 渲染的 HTML 节点发生改变,之前已经存在渲染器,先销毁之前渲染器 this.renderer.destroy(); this.renderer = null; // 重新记录渲染的 HTML 节点并创建渲染器 this.container = view; this.renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, this.container, { type: Renderer_1.RenderType.Video, onContextLost: () => { this.container = view; this.renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, this.container, { type: Renderer_1.RenderType.Canvas2D }); }, }); } else { // 第一次设置渲染的 HTML 节点,并创建渲染器,设置渲染回调 this.container = view; this.renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, this.container, { type: Renderer_1.RenderType.Video, onContextLost: () => { this.container = view; this.renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, this.container, { type: Renderer_1.RenderType.Canvas2D }); }, }); this.setMixedVideoFrameRenderCallback(); } } else { if (this.renderer) { this.renderer.destroy(); this.renderer = null; } this.container = null; this.unsetMixedVideoFrameRenderCallback(); } } setMixedVideoFrameRenderCallback() { const renderCallback = (frame) => { // console.log('trtc:local-media-transcoder:mixed frame:', frame); this.renderMixedVideoFrame(frame); }; this.nativeLocalMediaTranscoder.setVideoFrameRenderCallback(renderCallback, this.pixelFormat); } unsetMixedVideoFrameRenderCallback() { this.nativeLocalMediaTranscoder.setVideoFrameRenderCallback(null, this.pixelFormat); } setEventCallback() { const eventCallback = (eventName, ...params) => { // console.log('trtc:local-media-transcoder:event:', eventName, ...params); this.emit(eventName, ...params); }; this.nativeLocalMediaTranscoder.setTranscodingCallback(eventCallback); } renderMixedVideoFrame(frame) { if (!this.renderer || !this.container) { return; } const { width, height, data, timestamp, rotation } = frame; if (data) { const newData = data.slice(0); // Electron 12及以下版本需要复制一次,否则会引起奔溃。 this.renderer.drawFrame({ data: newData, width, height, timestamp, rotation, isNeedRotate: false, }); } } } exports.default = TRTCLocalMediaTranscoder;