164 lines
5.2 KiB
JavaScript
164 lines
5.2 KiB
JavaScript
// 在 preload 脚本中。
|
|
const { ipcRenderer, contextBridge } = require('electron')
|
|
const {
|
|
createAgoraRtcEngine,
|
|
ClientRoleType,
|
|
VideoSourceType,
|
|
VideoViewSetupMode,
|
|
ScreenCaptureSourceType,
|
|
RenderModeType,
|
|
} = require("agora-electron-sdk");
|
|
const agoraAonfig = require('./src/utils/package/agoraConfig')
|
|
const rtcEngine = createAgoraRtcEngine();
|
|
rtcEngine.initialize({
|
|
appId: agoraAonfig.appid,
|
|
});
|
|
|
|
let videoID = '';
|
|
const getDom = () => {
|
|
return document.getElementById(videoID);
|
|
}
|
|
|
|
const EventHandles = {
|
|
// 监听本地用户加入频道事件
|
|
onJoinChannelSuccess: ({ channelId, localUid }, elapsed) => {
|
|
const dom = document.getElementById('video1')
|
|
// 本地用户加入频道后,设置本地视频窗口
|
|
rtcEngine.setupLocalVideo({
|
|
renderMode: RenderModeType.RenderModeFit,
|
|
sourceType: VideoSourceType.VideoSourceScreen,
|
|
uid: localUid,
|
|
view: dom,
|
|
// view: getDom(),
|
|
setupMode: VideoViewSetupMode.VideoViewSetupAdd,
|
|
});
|
|
},
|
|
// 监听远端用户加入频道事件
|
|
onUserJoined: ({ channelId, localUid }, remoteUid, elapsed) => {
|
|
console.log('远端用户 ' + remoteUid + ' 已加入');
|
|
const dom = document.getElementById('video2')
|
|
// 远端用户加入频道后,设置远端视频窗口
|
|
rtcEngine.setupRemoteVideo(
|
|
{
|
|
renderMode: RenderModeType.RenderModeFit,
|
|
sourceType: VideoSourceType.VideoSourceRemote,
|
|
uid: remoteUid,
|
|
view: dom,
|
|
setupMode: VideoViewSetupMode.VideoViewSetupAdd,
|
|
},
|
|
{ channelId },
|
|
);
|
|
|
|
},
|
|
// 监听用户离开频道事件
|
|
onUserOffline: (info, remoteUid, reason) => {
|
|
console.log('远端用户 ' + remoteUid + ' 已离开频道');
|
|
// 远端用户离开频道后,关闭远端视频窗口
|
|
const dom = document.getElementById('video2')
|
|
rtcEngine.setupRemoteVideo(
|
|
{
|
|
renderMode: RenderModeType.RenderModeFit,
|
|
sourceType: VideoSourceType.VideoSourceRemote,
|
|
uid: remoteUid,
|
|
view: dom,
|
|
setupMode: VideoViewSetupMode.VideoViewSetupRemove,
|
|
},
|
|
);
|
|
},
|
|
};
|
|
rtcEngine.registerEventHandler(EventHandles);
|
|
|
|
|
|
contextBridge.exposeInMainWorld(
|
|
'electron',
|
|
{
|
|
// 桌面捕获音频和视频的媒体源的信息
|
|
getDesktopCapturerVideo: async () => {
|
|
return rtcEngine.getScreenCaptureSources({ width: 300, height: 300 }, { width: 300, height: 300 }, true);
|
|
},
|
|
|
|
// 设置视频播放
|
|
setDesktopCapturerVideo: (targetSource) => {
|
|
rtcEngine.stopScreenCapture()
|
|
if (
|
|
targetSource.type ===
|
|
ScreenCaptureSourceType.ScreencapturesourcetypeScreen
|
|
) {
|
|
rtcEngine.startScreenCaptureByDisplayId(
|
|
targetSource.sourceId,
|
|
{},
|
|
{
|
|
windowFocus: true,
|
|
enableHighLight: true,
|
|
highLightColor: 0xFF99CC00,
|
|
}
|
|
);
|
|
} else {
|
|
rtcEngine.startScreenCaptureByWindowId(
|
|
targetSource.sourceId,
|
|
{},
|
|
{
|
|
windowFocus: true,
|
|
enableHighLight: true,
|
|
highLightColor: 0xFF99CC00,
|
|
}
|
|
);
|
|
}
|
|
videoID = `vidoe-${123}-${agoraAonfig.channelId}`;
|
|
rtcEngine.joinChannel(agoraAonfig.token, agoraAonfig.channelId, 123, {
|
|
autoSubscribeAudio: true, //设置是否自动订阅所有音频流
|
|
autoSubscribeVideo: true, //设置是否自动订阅所有视频流
|
|
publishMicrophoneTrack: false, //设置是否发布麦克风采集到的音频
|
|
publishCameraTrack: false, //设置是否发布摄像头采集的视频
|
|
clientRoleType: ClientRoleType.ClientRoleBroadcaster, //用户角色 1主播 2观众
|
|
publishScreenTrack: true, //设置是否发布屏幕采集的视频
|
|
});
|
|
},
|
|
// 加入频道
|
|
setJoinChannel: () => {
|
|
videoID = `vidoe-${234}-${agoraAonfig.channelId}`;
|
|
rtcEngine.joinChannelEx(agoraAonfig.token, {
|
|
channelId: agoraAonfig.channelId,
|
|
localUid: 234,
|
|
}, {
|
|
autoSubscribeAudio: true, //设置是否自动订阅所有音频流
|
|
autoSubscribeVideo: true, //设置是否自动订阅所有视频流
|
|
publishMicrophoneTrack: false, //设置是否发布麦克风采集到的音频
|
|
publishCameraTrack: false, //设置是否发布摄像头采集的视频
|
|
clientRoleType: ClientRoleType.ClientRoleAudience, //用户角色 1主播 2观众
|
|
publishScreenTrack: true, //设置是否发布屏幕采集的视频
|
|
});
|
|
},
|
|
// 获取当前生成的视频id
|
|
getVideoId: () => {
|
|
return videoID;
|
|
},
|
|
// 获取摄像头以及音频内容
|
|
getCameraAndMicrophoneMedia: async () => {
|
|
try {
|
|
const stream = await navigator.mediaDevices.getUserMedia({
|
|
video: true,
|
|
audio: true,
|
|
});
|
|
stream.getTracks().forEach(track => track.stop());
|
|
return stream
|
|
} catch (error) {
|
|
return false;
|
|
}
|
|
},
|
|
// 设置窗口大小
|
|
setMainWindowSize: (config) => {
|
|
ipcRenderer.invoke('setMainWindowSize', { ...config })
|
|
},
|
|
// 设置窗口状态
|
|
setViewStatus: (status) => {
|
|
ipcRenderer.invoke('setViewStatus', status)
|
|
},
|
|
// 获取当前是否全屏
|
|
getIsMaximized: () => {
|
|
return ipcRenderer.invoke('getIsMaximized')
|
|
}
|
|
}
|
|
)
|
|
|