diff --git a/main.js b/main.js index e7f221a..c4d0bb7 100644 --- a/main.js +++ b/main.js @@ -12,6 +12,7 @@ const { } = require('electron'); const path = require('node:path') const fs = require('fs'); +const https = require('https'); const { autoUpdater, CancellationToken } = require('electron-updater'); const cancellationToken = new CancellationToken() app.allowRendererProcessReuse = false; @@ -271,6 +272,25 @@ app.on('ready', () => { const y = Math.round((display.workArea.height - mainWindow.getSize()[1]) / 2); mainWindow.setPosition(x, y); }); + + // 监听渲染进程请求应用数据目录 + ipcMain.handle('get-user-data-path', () => { + return app.getPath('userData'); + }); + // 用户数据目录路径 + global.userDataPath = app.getPath('userData'); // 全局变量 + console.log('User Data Path:', global.userDataPath); + // 检查并下载 ffmpeg + checkAndDownloadFFmpeg(userDataPath) + .then(() => { + console.log('FFmpeg is ready for use.'); + // 在这里执行任何依赖于 ffmpeg 的操作 + }) + .catch(error => { + console.error('Failed to ensure ffmpeg is available:', error); + app.quit(); + }); + } }); // 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写 @@ -339,3 +359,42 @@ function cancleDownloadUpdate() { function quitAndInstall() { autoUpdater.quitAndInstall(); } + + + +// 下载文件 +function downloadFile(url, dest) { + return new Promise((resolve, reject) => { + const file = fs.createWriteStream(dest); + https.get(url, function (response) { + response.pipe(file); + file.on('finish', function () { + file.close(resolve); + }); + }).on('error', function (err) { + fs.unlink(dest, () => reject(err)); + }); + }); +} + +// 检查并下载ffmpeg +function checkAndDownloadFFmpeg(appPath) { + const ffmpegPath = path.join(appPath, 'ffmpeg.exe'); + return new Promise((resolve, reject) => { + if (!fs.existsSync(ffmpegPath)) { + console.log(`ffmpeg.exe not found at ${ffmpegPath}, downloading...`); + downloadFile('https://meeting-api.23544.com/meeting/update/ffmpeg.exe', ffmpegPath) + .then(() => { + console.log('ffmpeg.exe downloaded successfully.'); + resolve(); + }) + .catch(error => { + console.error('Error downloading ffmpeg.exe:', error); + reject(error); + }); + } else { + console.log(`ffmpeg.exe found at ${ffmpegPath}.`); + resolve(); + } + }); +} \ No newline at end of file diff --git a/src/page/Meeting/index.tsx b/src/page/Meeting/index.tsx index 0239c3f..b149468 100644 --- a/src/page/Meeting/index.tsx +++ b/src/page/Meeting/index.tsx @@ -21,7 +21,9 @@ import StupWizard from '@/components/StupWizard'; import EquipmentManagement from '@/components/EquipmentManagement'; import UserVideo from '@/components/UserVideo'; import { role } from '@/config/role'; +import path from 'path'; const { confirm } = Modal; +const { ipcRenderer } = require('electron'); const { exec } = require('child_process'); const fs = require('fs').promises; dayjs.extend(durationPlugin); @@ -541,13 +543,54 @@ const Meeting: React.FC = () => { recorder.start(); recorder.ondataavailable = (event: any) => { const blob = new Blob([event.data], { - type: 'video/mp4', + type: 'video/webm', }); 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, {}); + + // 获取当前日期并格式化 + const date = new Date(); + const year = date.getFullYear(); + const month = date.getMonth() + 1; // JavaScript月份从0开始 + const day = date.getDate(); + const hours = date.getHours(); + const minutes = date.getMinutes(); + const formattedDate = `${year}年${month}月${day}日${hours}时${minutes}分`; + + 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, {}); + const mp4Path = `${setting.recordingFilesPath}会议录制_${state.roomName}_${state.channelId}_${formattedDate}_beforehanlder.mp4`; + await fs.writeFile(mp4Path, buffer); + + const userDataPath = await ipcRenderer.invoke('get-user-data-path'); + // 获取应用程序安装路径 + const ffmpegPath = path.join(userDataPath, "ffmpeg.exe"); + + const inputFilePath = mp4Path; // 输入文件路径 + const outputFilePath = mp4Path.replace('_beforehanlder', ''); // 输出文件路径 + const command = `${ffmpegPath} -i "${inputFilePath}" -vcodec copy -acodec copy "${outputFilePath}"`; + + exec(command, (error, stdout, stderr) => { + if (error) { + console.error('Error executing ffmpeg command:', error); + return; + } + // 删除输入文件 + fs.unlink(inputFilePath, (err) => { + if (err) { + console.error('Error deleting input file:', err); + } else { + console.log('Input file deleted successfully.'); + } + }); + + }) + + confirm({ title: '提示', icon: ,