Merge pull request '引入新插件解决视频保存问题' (#3) from yj into master

Reviewed-on: #3
This commit is contained in:
yj 2024-09-22 12:06:41 +08:00
commit 1c92406b1c
4 changed files with 75 additions and 14 deletions

65
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "WGShare.Metting",
"version": "0.0.1",
"version": "0.1.14",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "WGShare.Metting",
"version": "0.0.1",
"version": "0.1.14",
"dependencies": {
"@ant-design/icons": "^5.3.7",
"@microsoft/signalr": "^8.0.0",
@ -28,7 +28,8 @@
"react-redux": "^9.1.2",
"react-router-dom": "^6.23.1",
"sass": "^1.77.5",
"tldraw": "^2.2.0"
"tldraw": "^2.2.0",
"webm-duration-fix-buffer": "^1.0.0"
},
"devDependencies": {
"@types/react": "^17.0.33",
@ -5043,6 +5044,11 @@
"node": ">=0.10.0"
}
},
"node_modules/ebml-block": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/ebml-block/-/ebml-block-1.1.2.tgz",
"integrity": "sha512-HgNlIsRFP6D9VKU5atCeHRJY7XkJP8bOe8yEhd8NB7B3b4++VWTyauz6g650iiPmLfPLGlVpoJmGSgMfXDYusg=="
},
"node_modules/ejs": {
"version": "3.1.10",
"resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz",
@ -5823,6 +5829,14 @@
"resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz",
"integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
},
"node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"engines": {
"node": ">=0.8.x"
}
},
"node_modules/eventsource": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/eventsource/-/eventsource-2.0.2.tgz",
@ -7329,6 +7343,14 @@
"resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
},
"node_modules/int64-buffer": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/int64-buffer/-/int64-buffer-1.0.1.tgz",
"integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==",
"engines": {
"node": ">= 4.5.0"
}
},
"node_modules/into-stream": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/into-stream/-/into-stream-3.1.0.tgz",
@ -11977,6 +11999,17 @@
"resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"node_modules/webm-duration-fix-buffer": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/webm-duration-fix-buffer/-/webm-duration-fix-buffer-1.0.0.tgz",
"integrity": "sha512-y6+5MJxduGp8uoclwzbnCEpNtO9gscj39BSQwdyqDk66q9a+vb5fWhxwR5JmMhWCGlZLbP4O/p29mxjbMGPt+A==",
"dependencies": {
"buffer": "^6.0.3",
"ebml-block": "^1.1.2",
"events": "^3.3.0",
"int64-buffer": "^1.0.1"
}
},
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz",
@ -15743,6 +15776,11 @@
}
}
},
"ebml-block": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/ebml-block/-/ebml-block-1.1.2.tgz",
"integrity": "sha512-HgNlIsRFP6D9VKU5atCeHRJY7XkJP8bOe8yEhd8NB7B3b4++VWTyauz6g650iiPmLfPLGlVpoJmGSgMfXDYusg=="
},
"ejs": {
"version": "3.1.10",
"resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz",
@ -16265,6 +16303,11 @@
"resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz",
"integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
},
"events": {
"version": "3.3.0",
"resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
},
"eventsource": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/eventsource/-/eventsource-2.0.2.tgz",
@ -17425,6 +17468,11 @@
"resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
},
"int64-buffer": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/int64-buffer/-/int64-buffer-1.0.1.tgz",
"integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw=="
},
"into-stream": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/into-stream/-/into-stream-3.1.0.tgz",
@ -20902,6 +20950,17 @@
"resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"webm-duration-fix-buffer": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/webm-duration-fix-buffer/-/webm-duration-fix-buffer-1.0.0.tgz",
"integrity": "sha512-y6+5MJxduGp8uoclwzbnCEpNtO9gscj39BSQwdyqDk66q9a+vb5fWhxwR5JmMhWCGlZLbP4O/p29mxjbMGPt+A==",
"requires": {
"buffer": "^6.0.3",
"ebml-block": "^1.1.2",
"events": "^3.3.0",
"int64-buffer": "^1.0.1"
}
},
"whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz",

View File

@ -43,7 +43,8 @@
"react-redux": "^9.1.2",
"react-router-dom": "^6.23.1",
"sass": "^1.77.5",
"tldraw": "^2.2.0"
"tldraw": "^2.2.0",
"webm-duration-fix-buffer": "^1.0.0"
},
"devDependencies": {
"@types/react": "^17.0.33",
@ -102,7 +103,7 @@
"deleteAppDataOnUninstall": true,
"shortcutName": "智汇享",
"allowElevation": true,
"perMachine":true
"perMachine": true
}
}
}

View File

@ -472,10 +472,12 @@ const User: React.FC = () => {
onClick={() => {
const file = document.createElement("input") as any;
file.type = "file";
file.accept = ".xls,.xlsx";
// file.accept = ".xls,.xlsx";
file.onchange = async () => {
const setting = await JSON.parse(storage.getItem('setting') as string)
const fileInfo = file.files[0];
console.log(fileInfo);
return
const formData = new FormData();
formData.append("file", fileInfo);
await PostUserImport(formData).then(res => {

View File

@ -21,6 +21,7 @@ import StupWizard from '@/components/StupWizard';
import EquipmentManagement from '@/components/EquipmentManagement';
import UserVideo from '@/components/UserVideo';
import { role } from '@/config/role';
import { fixWebmDuration } from "webm-duration-fix-buffer";
const { confirm } = Modal;
const { exec } = require('child_process');
const fs = require('fs').promises;
@ -539,15 +540,13 @@ const Meeting: React.FC = () => {
useEffect(() => {
if (recorder) {
recorder.start();
recorder.ondataavailable = (event: any) => {
const blob = new Blob([event.data], {
type: 'video/mp4',
});
recorder.ondataavailable = async (event: any) => {
const blob = await fixWebmDuration(event.data);
const reader = new FileReader() as any;
reader.onload = async () => {
const setting = await JSON.parse(storage.getItem('setting') as string)
const buffer = Buffer.from(reader.result);
await fs.writeFile(`${setting.recordingFilesPath}会议录制_${state.roomName}_${state.channelId}_${+new Date()}.mp4`, buffer, {});
await fs.writeFile(`${setting.recordingFilesPath}会议录制_${state.roomName}_${state.channelId}_${+new Date()}.webm`, buffer, {});
confirm({
title: '提示',
icon: <ExclamationCircleFilled />,
@ -1060,12 +1059,12 @@ const Meeting: React.FC = () => {
// 合并音频流与视频流
const combinedSource = new MediaStream([...stream.getVideoTracks(), ...systemSoundDestination.stream.getAudioTracks()]);
// 开始录制
const recorder = new MediaRecorder(combinedSource, {
const mediaRecorder = new MediaRecorder(combinedSource, {
mimeType: 'video/webm;codecs=vp9,opus',
videoBitsPerSecond: 1.5e6,
});
setMediaStream(combinedSource);
setRecorder(recorder);
setRecorder(mediaRecorder);
});
} catch (error: any) {
if (error.code === 'ENOENT') {