视频缓存
This commit is contained in:
parent
7d0b53cf3e
commit
c37edce16d
53
src/App.tsx
53
src/App.tsx
|
|
@ -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} />
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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> => {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue