trtc-electron-sdk
Version:
trtc electron sdk
195 lines (194 loc) • 7.92 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.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;