trtc-electron-sdk
Version:
trtc electron sdk
602 lines (601 loc) • 29.4 kB
JavaScript
"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;