UNPKG

trtc-electron-sdk

Version:

trtc electron sdk

195 lines (194 loc) 7.92 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.VodPlayer = exports.PlayerEvents = void 0; const events_1 = require("events"); const Renderer_1 = require("./Renderer"); const trtc_define_1 = require("./trtc_define"); const logger_1 = __importDefault(require("./logger")); const util_1 = require("./Renderer/util"); const NodeTRTCEngine = require('../build/Release/trtc_electron_sdk.node'); const DEFAULT_VIDEO_WIDTH = 640; const DEFAULT_VIDEO_HEIGHT = 360; var PlayerEvents; (function (PlayerEvents) { PlayerEvents["onVodPlayerStarted"] = "onVodPlayerStarted"; PlayerEvents["onVodPlayerProgress"] = "onVodPlayerProgress"; PlayerEvents["onVodPlayerPaused"] = "onVodPlayerPaused"; PlayerEvents["onVodPlayerResumed"] = "onVodPlayerResumed"; PlayerEvents["onVodPlayerStoped"] = "onVodPlayerStoped"; PlayerEvents["onVodPlayerError"] = "onVodPlayerError"; })(PlayerEvents = exports.PlayerEvents || (exports.PlayerEvents = {})); class VodPlayer extends events_1.EventEmitter { constructor(mediaFilePath, repeat) { super(); this.nativeVodPlayer = new NodeTRTCEngine.NodeVodPlayer(mediaFilePath, repeat); this.mediaFilePath = mediaFilePath; this.repeat = repeat; this.view = null; this.isStarted = false; this.vodPlayerVideoBuffer = new trtc_define_1.VideoBufferInfo(); this.pixelLength = 1.5; this.pixelFormat = trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420; this.setVodPlayerEventCallback(); } setVodPlayerView(view) { this.view = view; this._initRender(this.view); } start() { this.nativeVodPlayer.streamType = trtc_define_1.TRTCVideoStreamType.TRTCVideoStreamTypeBig; this.vodPlayerVideoBuffer.buffer = (0, util_1.allocBuffer)(DEFAULT_VIDEO_WIDTH * DEFAULT_VIDEO_HEIGHT * this.pixelLength); this.nativeVodPlayer.id = (0, util_1.generateUniqueId)(); this.nativeVodPlayer.pixelFormat = this.pixelFormat; this.nativeVodPlayer.width = DEFAULT_VIDEO_WIDTH; this.nativeVodPlayer.height = DEFAULT_VIDEO_HEIGHT; this.nativeVodPlayer.setVideoBuffer('', this.vodPlayerVideoBuffer.buffer, this.nativeVodPlayer.streamType, this.nativeVodPlayer.width, this.nativeVodPlayer.height, this.nativeVodPlayer.pixelFormat, this.nativeVodPlayer.id); this.setVodPlayerDataCallback(); if (!this.isStarted) { this.nativeVodPlayer.start(); } this.isStarted = true; } pause() { this.nativeVodPlayer.pause(); } resume() { this.nativeVodPlayer.resume(); } stop() { this.isStarted = false; this.nativeVodPlayer.stop(); if (this.vodPlayerVideoBuffer.buffer) { this.nativeVodPlayer.setVideoBuffer('', this.vodPlayerVideoBuffer.buffer, this.nativeVodPlayer.streamType, 0, 0, this.nativeVodPlayer.pixelFormat, 0); this.vodPlayerVideoBuffer.buffer = null; this.vodPlayerVideoBuffer.id = 0; } } seek(msPos) { this.nativeVodPlayer.seek(msPos); } getDuration() { return this.nativeVodPlayer.getDuration(); } getWidth() { return this.nativeVodPlayer.getWidth(); } getHeight() { return this.nativeVodPlayer.getHeight(); } mute(mute) { this.nativeVodPlayer.mute(mute); } setVolume(volume) { this.nativeVodPlayer.setVolume(volume); } attachTRTC() { this.nativeVodPlayer.attachTRTC(); } detachTRTC() { this.nativeVodPlayer.detachTRTC(); } publishVideo() { this.nativeVodPlayer.publishVideo(); } publishAudio() { this.nativeVodPlayer.publishAudio(); } unpublishVideo() { this.nativeVodPlayer.unpublishVideo(); } unpublishAudio() { this.nativeVodPlayer.unpublishAudio(); } setVodPlayerDataCallback() { this.nativeVodPlayer.setDataCallback((args) => { const [id, type, width, height, timestamp, rotation, valid, bufferId] = args; if (valid === true) { this._renderVodVideoFrame(this.vodPlayerVideoBuffer.buffer, width, height, timestamp, rotation); } else { this.handleVideoSizeChange(id, type, width, height); } }); } setVodPlayerEventCallback() { this.nativeVodPlayer.setEventCallback((args) => { const key = args[0]; const data = args[1]; switch (key) { case 'onVodPlayerStarted': this.emit(key, data.msLength); break; case 'onVodPlayerProgress': this.emit(key, data.msPos); break; case 'onVodPlayerPaused': this.emit(key); break; case 'onVodPlayerResumed': this.emit(key); break; case 'onVodPlayerStoped': this.emit(key, data.reason); break; case 'onVodPlayerError': this.emit(key, data.error); break; default: break; } }); } _renderVodVideoFrame(data, width, height, timestamp, rotation) { if (!this.renderer || !this.view) { return; } if (data) { const newData = data.slice(0); // Electron 12 及以下版本,来自底层的帧数据必须复制一次,否则 WebGL 渲染阶段会奔溃 const realRotation = rotation * 90; //ratation是0, 1, 2, 3. 绘制内部使用0, 90, 180, 270 this.renderer.drawFrame({ data: newData, width, height, timestamp, rotation: realRotation, isNeedRotate: false, }); } } handleVideoSizeChange(userId, streamType, width, height) { if (this.vodPlayerVideoBuffer.width !== width || this.vodPlayerVideoBuffer.height !== height) { this.vodPlayerVideoBuffer.buffer = (0, util_1.allocBuffer)(width * height * this.pixelLength); this.vodPlayerVideoBuffer.id = (0, util_1.generateUniqueId)(); this.vodPlayerVideoBuffer.width = width; this.vodPlayerVideoBuffer.height = height; this.vodPlayerVideoBuffer.pixelFormat = this.pixelFormat; this.nativeVodPlayer.setVideoBuffer(userId, this.vodPlayerVideoBuffer.buffer, streamType, width, height, this.vodPlayerVideoBuffer.pixelFormat, this.vodPlayerVideoBuffer.id); } } _initRender(view) { if (this.renderer) { this.destroyRender(); } view.innerHTML = ''; // 事先清空一下,避免画面叠加 this.renderer = (0, Renderer_1.createRenderer)(trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420, view, { type: Renderer_1.RenderType.Video, onContextLost: () => { this.renderer = (0, Renderer_1.createRenderer)(trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420, view, { type: Renderer_1.RenderType.Canvas2D }); }, }); } destroyRender() { try { this.renderer.destroy(); this.renderer = null; } catch (err) { logger_1.default.error('[VodPlayer]destroyRender failed:', err); } } } exports.VodPlayer = VodPlayer;