视频缓存

This commit is contained in:
yj 2024-07-26 15:03:22 +08:00
parent 7d0b53cf3e
commit c37edce16d
3 changed files with 58 additions and 29 deletions

View File

@ -1,25 +1,25 @@
import {useEffect, useRef, useState} from "react"; import { useEffect, useRef, useState } from "react";
import '@/utils/styles/App.scss' import '@/utils/styles/App.scss'
import {Navigate, Route, Routes, useLocation, useNavigate} from 'react-router-dom'; import { Navigate, Route, Routes, useLocation, useNavigate } from 'react-router-dom';
import Home from '@/page/Home/index' import Home from '@/page/Home/index'
import Index from '@/page/Home/Index/index' import Index from '@/page/Home/Index/index'
import User from '@/page/Home/User/index' import User from '@/page/Home/User/index'
import Login from '@/page/Login/index' import Login from '@/page/Login/index'
import Meeting from '@/page/Meeting/index' import Meeting from '@/page/Meeting/index'
import NotFound from '@/page/NotFound/index' import NotFound from '@/page/NotFound/index'
import {storage} from '@/utils' import { storage } from '@/utils'
import {message, Spin} from "antd"; import { message, Spin } from "antd";
import {onInvitation, onInvoke, onReconnected, onStart, startSignalr} from "@/utils/package/signalr"; import { onInvitation, onInvoke, onReconnected, onStart, startSignalr } from "@/utils/package/signalr";
import JoinMeetingModal from "@/components/JoinMeetingModal"; import JoinMeetingModal from "@/components/JoinMeetingModal";
import UpdateModal from "@/components/UpdateModal"; import UpdateModal from "@/components/UpdateModal";
import * as CryptoJS from 'crypto-js'; import * as CryptoJS from 'crypto-js';
import {PostLogin} from "@/api/Login"; import { PostLogin } from "@/api/Login";
import agora from "@/utils/package/agora"; import agora from "@/utils/package/agora";
import QuitTips from "@/components/QuitTips"; import QuitTips from "@/components/QuitTips";
const App: React.FC = () => { const App: React.FC = () => {
const navigate = useNavigate(); const navigate = useNavigate();
const {state} = useLocation(); const { state } = useLocation();
const joinMeetingModalRef = useRef<any>(); const joinMeetingModalRef = useRef<any>();
const updateModalRef = useRef<any>(); const updateModalRef = useRef<any>();
const quitTipsRef = useRef<any>(); const quitTipsRef = useRef<any>();
@ -120,9 +120,22 @@ const App: React.FC = () => {
onReconnected(async () => { onReconnected(async () => {
storage.setItem('reconnect', true) storage.setItem('reconnect', true)
}) })
window.electron.onUpdate((e: any, data: any) => { window.electron.onUpdate((_e: any, data: any) => {
updateModalRef.current.changeModal(data) updateModalRef.current.changeModal(data)
}) })
if (!storage.getItem('setting')) {
storage.setItem('setting', JSON.stringify({
videoDeviceId: '', //摄像头id
ecordingDeviceId: "", //输入设备id
playBackDeviceId: "", //输出设备id
ecordingVolume: '', //输入音量
playBackVolume: '', //输出音量
autoEcordingVolume: false, //是否自动调整麦克风音量
recordingFilesPath: '', //本地录制保存路径
shareFilesPath: '', //共享文件保存路径
isShareSavePath: false, //是否下载钱询问每个文件保存的位置
}))
}
}, []) }, [])
useEffect(() => { useEffect(() => {
if (isState) { if (isState) {
@ -173,20 +186,20 @@ const App: React.FC = () => {
return ( return (
<> <>
<Routes> <Routes>
<Route path='/' element={<Home/>}/> <Route path='/' element={<Home />} />
<Route path='/home' element={<Home/>}> <Route path='/home' element={<Home />}>
<Route path='/home' element={<Navigate to='/home/index'/>}/> <Route path='/home' element={<Navigate to='/home/index' />} />
<Route path='/home/index' element={<Index/>}/> <Route path='/home/index' element={<Index />} />
<Route path='/home/user' element={<User/>}/> <Route path='/home/user' element={<User />} />
</Route> </Route>
<Route path='/login' element={<Login/>}/> <Route path='/login' element={<Login />} />
<Route path='/meeting' element={<Meeting/>}/> <Route path='/meeting' element={<Meeting />} />
<Route path='*' element={<NotFound/>}/> <Route path='*' element={<NotFound />} />
</Routes> </Routes>
<Spin spinning={spinning} fullscreen/> <Spin spinning={spinning} fullscreen />
<JoinMeetingModal ref={joinMeetingModalRef}/> <JoinMeetingModal ref={joinMeetingModalRef} />
<UpdateModal ref={updateModalRef}/> <UpdateModal ref={updateModalRef} />
<QuitTips ref={quitTipsRef}/> <QuitTips ref={quitTipsRef} />
</> </>
) )
} }

View File

@ -1,6 +1,6 @@
import styles from '@/components/StupWizard/index.module.scss' import styles from '@/components/StupWizard/index.module.scss'
import ImageUrl from '@/utils/package/ImageUrl'; import ImageUrl from '@/utils/package/ImageUrl';
import { Button, Checkbox, Empty, Input, message, Modal, Select, Slider } from 'antd'; import { Button, Checkbox, Empty, Input, Modal, Select, Slider } from 'antd';
import { useState, useImperativeHandle, forwardRef, useEffect } from "react"; import { useState, useImperativeHandle, forwardRef, useEffect } from "react";
import agora from '@/utils/package/agora' import agora from '@/utils/package/agora'
import { CloseOutlined, LoadingOutlined } from '@ant-design/icons'; import { CloseOutlined, LoadingOutlined } from '@ant-design/icons';
@ -101,9 +101,17 @@ const VideoComponents = () => {
useEffect(() => { useEffect(() => {
getVideoDeviceList() getVideoDeviceList()
}, []); }, []);
const getVideoDeviceList = (): void => { const getVideoDeviceList = async (): Promise<void> => {
const setting = await JSON.parse(storage.getItem('setting') as string)
agora.getVideoDeviceManager().then(async (res) => { agora.getVideoDeviceManager().then(async (res) => {
const { item, list } = res const { item, list } = res
if ((!setting.videoDeviceId && item) || (!(list.find((item: any) => item.deviceId === setting.videoDeviceId)) && item)) {
setting.videoDeviceId = item
}
if (!list.length) {
setting.videoDeviceId = ''
}
storage.setItem('setting', JSON.stringify(setting))
setVideoDeviceManager({ setVideoDeviceManager({
list: list.map((row: any) => { list: list.map((row: any) => {
return { return {
@ -111,10 +119,11 @@ const VideoComponents = () => {
label: row.deviceName label: row.deviceName
} }
}), }),
item: item ? item : null, item: setting.videoDeviceId ? setting.videoDeviceId : item || null,
}) })
if (item) { if (setting.videoDeviceId && list.length) {
agora.startPreview('videoPreview', Number(userInfo.account)) await agora.setVideoDeviceManager(setting.videoDeviceId)
await agora.startPreview('videoPreview', Number(userInfo.account))
} }
}) })
} }
@ -136,14 +145,21 @@ const VideoComponents = () => {
}} /> }} />
</div> </div>
</div> : </div> :
<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}><Empty description={'未检测到摄像头'} /></div> <div>
<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
<Empty description={'未检测到摄像头'} />
</div>
</div>
} }
<div> <div>
<span></span> <span></span>
<Select <Select
placeholder={videoDeviceManager.list.length ? '请选择设备' : '未检测到摄像头'} placeholder={videoDeviceManager.list.length ? '请选择设备' : '未检测到摄像头'}
options={videoDeviceManager.list} style={{ flexGrow: 1 }} options={videoDeviceManager.list} style={{ flexGrow: 1 }}
value={videoDeviceManager.item} onChange={(e) => { value={videoDeviceManager.item} onChange={async (e) => {
const setting = await JSON.parse(storage.getItem('setting') as string)
setting.videoDeviceId = e;
storage.setItem('setting', JSON.stringify(setting))
setVideoDeviceManager({ setVideoDeviceManager({
...videoDeviceManager, ...videoDeviceManager,
item: e item: e

View File

@ -274,8 +274,8 @@ const agora = {
} }
}, },
// 通过设备 ID 指定视频采集设备。 // 通过设备 ID 指定视频采集设备。
setVideoDeviceManager: (deviceIdUTF8: string) => { setVideoDeviceManager: async (deviceIdUTF8: string) => {
rtcEngine.getVideoDeviceManager().setDevice(deviceIdUTF8) await rtcEngine.getVideoDeviceManager().setDevice(deviceIdUTF8)
}, },
// 开启本地视频预览 // 开启本地视频预览
startPreview: async (id: string, uid: number): Promise<void> => { startPreview: async (id: string, uid: number): Promise<void> => {