This commit is contained in:
yj 2025-01-21 10:29:43 +08:00
parent dc619db987
commit 678962d1e9
4 changed files with 51 additions and 34 deletions

View File

@ -170,7 +170,7 @@ const JoinSetting = forwardRef((_props: any, ref: any) => {
setJoinRoomSettingForm(list) setJoinRoomSettingForm(list)
if (index === 1) { if (index === 1) {
if (list[index].active) { if (list[index].active) {
agora.startPreview('videoPreview', Number(user.screenShareId)) agora.startPreview('videoPreview', Number(user.screenShareId), +new Date())
} }
} }
} else { } else {

View File

@ -11,6 +11,7 @@ import { storageSeeting } from '@/utils/package/public';
let meetingUserInfo = '' as any; let meetingUserInfo = '' as any;
const fs = require('fs').promises; const fs = require('fs').promises;
const { exec } = require('child_process'); const { exec } = require('child_process');
let c = +new Date();
const StupWizard = forwardRef((_props: any, ref: any) => { const StupWizard = forwardRef((_props: any, ref: any) => {
useImperativeHandle(ref, () => ({ useImperativeHandle(ref, () => ({
changeModal: (index: number = 0, data: any) => { changeModal: (index: number = 0, data: any) => {
@ -84,6 +85,8 @@ const StupWizard = forwardRef((_props: any, ref: any) => {
{list.map((row: any, index: number) => { {list.map((row: any, index: number) => {
return ( return (
<div key={index} className={`${row.active ? styles.active : ''}`} onClick={async () => { <div key={index} className={`${row.active ? styles.active : ''}`} onClick={async () => {
const userInfo = JSON.parse(storage.getItem('user') as string)
await agora.destroyRendererByConfigPreview(Number(userInfo.screenShareId), c)
const newList = [...list]; const newList = [...list];
newList.forEach(item => item.active = false); newList.forEach(item => item.active = false);
newList[index].active = true; newList[index].active = true;
@ -247,7 +250,7 @@ const VideoComponents = () => {
}) })
if (setting.videoDeviceId && list.length) { if (setting.videoDeviceId && list.length) {
await agora.setVideoDeviceManager(setting.videoDeviceId) await agora.setVideoDeviceManager(setting.videoDeviceId)
await agora.startPreview('videoPreview', Number(userInfo.screenShareId)) await agora.startPreview('videoPreview', Number(userInfo.screenShareId), c)
} }
}) })
} }
@ -305,7 +308,7 @@ const VideoComponents = () => {
agora.setVideoDeviceManager(e) agora.setVideoDeviceManager(e)
if (!setting.videoDeviceId) { if (!setting.videoDeviceId) {
const userInfo = JSON.parse(storage.getItem('user') as string) const userInfo = JSON.parse(storage.getItem('user') as string)
await agora.startPreview('videoPreview', Number(userInfo.screenShareId)) await agora.startPreview('videoPreview', Number(userInfo.screenShareId), c)
} }
setting.videoDeviceId = e; setting.videoDeviceId = e;
storage.setItem('setting', JSON.stringify(setting)) storage.setItem('setting', JSON.stringify(setting))

View File

@ -176,6 +176,7 @@ const Meeting: React.FC = () => {
const [_isLeave, setIsLeave] = useState(false) const [_isLeave, setIsLeave] = useState(false)
const [isScreenCapture, setIsScreenCapture] = useState(false) const [isScreenCapture, setIsScreenCapture] = useState(false)
const [isFluencyPriority, setIsFluencyPriority] = useState(false) const [isFluencyPriority, setIsFluencyPriority] = useState(false)
const [isClickLock, setIsClickLock] = useState(false)
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [modeOpen, setModeOpen] = useState(false) const [modeOpen, setModeOpen] = useState(false)
const [meetingMode, setMeetingMode] = useState('') const [meetingMode, setMeetingMode] = useState('')
@ -982,6 +983,7 @@ const Meeting: React.FC = () => {
channelId: state.channelId, channelId: state.channelId,
sourceType: VideoSourceType.VideoSourceCameraPrimary, sourceType: VideoSourceType.VideoSourceCameraPrimary,
}) })
setIsClickLock(false)
break; break;
case 2: case 2:
await agora.setupLocalVideo({ await agora.setupLocalVideo({
@ -990,6 +992,7 @@ const Meeting: React.FC = () => {
channelId: state.channelId, channelId: state.channelId,
sourceType: VideoSourceType.VideoSourceScreen, sourceType: VideoSourceType.VideoSourceScreen,
}) })
setIsClickLock(false)
break; break;
case 3: case 3:
await agora.setupRemoteVideoJoin({ await agora.setupRemoteVideoJoin({
@ -997,6 +1000,7 @@ const Meeting: React.FC = () => {
view: document.getElementById(`video-source-remote-screen`) as HTMLElement, view: document.getElementById(`video-source-remote-screen`) as HTMLElement,
channelId: state.channelId, channelId: state.channelId,
}) })
setIsClickLock(false)
break; break;
case 4: case 4:
await agora.setupRemoteVideoJoin({ await agora.setupRemoteVideoJoin({
@ -1004,13 +1008,16 @@ const Meeting: React.FC = () => {
view: document.getElementById(`video-source-remote-camera`) as HTMLElement, view: document.getElementById(`video-source-remote-camera`) as HTMLElement,
channelId: state.channelId, channelId: state.channelId,
}) })
setIsClickLock(false)
break; break;
} }
} }
setTimeout(() => { if (currentVideoUid) {
setView() setTimeout(() => {
}, currentVideoId ? 0 : 1500); setView()
}, [currentLookUserStatus]); }, currentVideoId ? 0 : 1500);
}
}, [currentVideoUid]);
useEffect(() => { useEffect(() => {
if (isScreenCapture) { if (isScreenCapture) {
@ -1431,20 +1438,20 @@ const Meeting: React.FC = () => {
} }
// 渲染视频 // 渲染视频
const renderVideo = async (uid: string = ''): Promise<void> => { const renderVideo = async (uid: string = ''): Promise<void> => {
if (isClickLock) {
return
}
if (uid) { if (uid) {
if (currentVideoId === uid) { if (currentVideoId === uid || currentVideoUid === uid) {
return return
} }
} else { } else {
uid = userInfo.uid uid = userInfo.uid
} }
setCurrentVideoUid(uid) await agora.destroyRendererByView(`video-source-camera-primary`)
if (currentVideoId) { await agora.destroyRendererByView(`video-source-screen`)
await agora.destroyRendererByView(`video-source-camera-primary`) await agora.destroyRendererByView(`video-source-remote-screen`)
await agora.destroyRendererByView(`video-source-screen`) await agora.destroyRendererByView(`video-source-remote-camera`)
await agora.destroyRendererByView(`video-source-remote-screen`)
await agora.destroyRendererByView(`video-source-remote-camera`)
}
setCurrentLookUserStatus(0) setCurrentLookUserStatus(0)
setRoomUserList((res: any) => { setRoomUserList((res: any) => {
let item = res.find((item: any) => item.uid === uid || item.screenShareId === uid) let item = res.find((item: any) => item.uid === uid || item.screenShareId === uid)
@ -1453,24 +1460,27 @@ const Meeting: React.FC = () => {
} }
return res return res
}) })
setTimeout(() => { setIsClickLock(true)
if (uid === userInfo.uid || uid === userInfo.screenShareId) { setCurrentVideoUid('')
if (String(uid).length === 9) { if (uid === userInfo.uid || uid === userInfo.screenShareId) {
// 共享屏幕 if (String(uid).length === 9) {
setCurrentLookUserStatus(2) // 共享屏幕
} else { setCurrentLookUserStatus(2)
// 摄像头
setCurrentLookUserStatus(1)
}
} else { } else {
if (String(uid).length === 9) { // 摄像头
// 共享屏幕 setCurrentLookUserStatus(1)
setCurrentLookUserStatus(3)
} else {
// 摄像头
setCurrentLookUserStatus(4)
}
} }
} else {
if (String(uid).length === 9) {
// 共享屏幕
setCurrentLookUserStatus(3)
} else {
// 摄像头
setCurrentLookUserStatus(4)
}
}
setTimeout(() => {
setCurrentVideoUid(uid)
}, 500); }, 500);
} }
// 全员观看 // 全员观看

View File

@ -393,6 +393,10 @@ export const agora = {
destroyRendererByConfig: async (uid: number, channelId?: string) => { destroyRendererByConfig: async (uid: number, channelId?: string) => {
await rtcEngine.destroyRendererByConfig(option.uid === uid ? VideoSourceType.VideoSourceCameraPrimary : VideoSourceType.VideoSourceRemote, channelId, uid); await rtcEngine.destroyRendererByConfig(option.uid === uid ? VideoSourceType.VideoSourceCameraPrimary : VideoSourceType.VideoSourceRemote, channelId, uid);
}, },
destroyRendererByConfigPreview: async (uid: number, channelId: number) => {
await agora.destroyRendererByView('videoPreview')
await rtcEngine.leaveChannelEx({ channelId: `${channelId + uid}`, localUid: Number(uid) })
},
destroyRendererByView: async (key: string) => { destroyRendererByView: async (key: string) => {
let dom = document.getElementById(key); let dom = document.getElementById(key);
if (dom) { if (dom) {
@ -515,12 +519,12 @@ export const agora = {
await rtcEngine.getVideoDeviceManager().setDevice(deviceIdUTF8) await rtcEngine.getVideoDeviceManager().setDevice(deviceIdUTF8)
}, },
// 开启本地视频预览 // 开启本地视频预览
startPreview: async (id: string, uid: number): Promise<void> => { startPreview: async (id: string, uid: number, channelId: number): Promise<void> => {
rtcEngine.enableVideo(); rtcEngine.enableVideo();
rtcEngine.startPreview(); rtcEngine.startPreview();
await GetRoomRtcToken(`${+new Date()}`).then(async (res) => { await GetRoomRtcToken(`${channelId + uid}`).then(async (res) => {
await rtcEngine.joinChannelEx(res.data, { await rtcEngine.joinChannelEx(res.data, {
channelId: `${+new Date() + uid}`, channelId: `${channelId + uid}`,
localUid: uid, localUid: uid,
}, { }, {
channelProfile: ChannelProfileType.ChannelProfileLiveBroadcasting, channelProfile: ChannelProfileType.ChannelProfileLiveBroadcasting,