
用 Electron 从 0 开发一个桌面软件(三)
最近没什么空,公司让我改个JSP的项目,折腾了两天。前两天改的东西验收上线了, 现在来继续做做我的格式转换器。前端的代码我都没有这么写,都是用deepseek 生成的,生成完之后我在改改。今天做好了可以批量选择视频进行格式转换,可以设置存储路径。下次更新先吧格式转换进度做出来。后面我想继续做的可能有几个功能。
·
大家好,我是一名,跨境行业 saas 软件开发的前端程序员,阿毛
这个我的个人网站
用 Electron 从 0 开发一个桌面软件,决定做一个视频转码软件,第三天。
最近没什么空,公司让我改个JSP的项目,折腾了两天。前两天改的东西验收上线了, 现在来继续做做我的格式转换器。
前端的代码我都没有这么写,都是用deepseek 生成的,生成完之后我在改改。
今天做好了可以批量选择视频进行格式转换,可以设置存储路径。
- 这次主要遇到的有两个小问题
- 本来以为在渲染进程通过 input 就直接能获取,但是试了之后发现其实有些信息书获取不到的,
比如帧数, 码率等。后面有采用和转码同样的方式,先传到主进程,生成文件,再通过 ffmpeg.ffprobe 来进行获取
function getVideoDetail(fileInfo: fileInfoDTO): Promise<VideoDetailDTO | null> {
return new Promise(async (resolve) => {
const url = await tempVideo(fileInfo)
fs.stat(url, (err, stats) => {
if (err) {
resolve(null)
return
}
const fileSizeInBytes = stats.size
const fileSizeInMB = (fileSizeInBytes / (1024 * 1024)).toFixed(2)
ffmpeg.ffprobe(url, (err, metadata) => {
if (err) {
console.error('获取视频元数据时出错:', err)
resolve(null)
return
}
// 获取视频流
const videoStream = metadata.streams.find((stream) => stream.codec_type === 'video')
// const audioStream = metadata.streams.find((stream) => stream.codec_type === 'audio')
if (videoStream) {
const frameRateArray = videoStream.r_frame_rate.split('/');
const frameRate = parseInt(frameRateArray[0], 10);
console.log(frameRate);
const obj: VideoDetailDTO = {
url: url,
name: fileInfo.name,
size: fileSizeInMB,
width: videoStream.width,
height: videoStream.height,
duration: metadata.format.duration,
codec_name: videoStream.codec_name,
r_frame_rate: frameRate,
bit_rate: Number((videoStream.bit_rate / 1000).toFixed(0)),
color_space: videoStream.color_space,
format_name: metadata.format.format_name
}
resolve(obj)
} else {
resolve(null)
}
})
})
})
}
- 文件存储路径的选择,我本来以为和 input 上传一样,选择一个文件夹即可, input 选择之后呢也获取不到真实的地址的,
后来搜了一下用了 electron 的 dialog 模块来选择目录
主进程
/**
* 选择 目录
* @param map
* @param event
* @param obj
*/
SELECT_FOLDER: (map: getMapFuns, event: Electron.IpcMainEvent): void => {
console.log('---')
const win = map?.getMainWin?.()
if (win) {
dialog.showOpenDialog(win, {
properties: ['openDirectory'] // 设置属性为 'openDirectory' 以仅打开目录选择器。
}).then(result => {
console.log(result)
if (!result.canceled) { // 检查用户是否点击了取消按钮。
event.reply('SELECT_FOLDER_RESP', result.filePaths[0])
} else {
event.reply('SELECT_FOLDER_RESP', null)
}
}).catch(err => {
console.error(err); // 处理可能的错误。
event.reply('SELECT_FOLDER_RESP', null)
});
}
}
下次更新先吧格式转换进度做出来
后面我想继续做的可能有几个功能
- 视频和音频的格式转换
- 视频的切片
- 定时任务,每隔一段时间扫描指定文件夹, 如果有新的未转换格式的文件,就去转换后放到指定文件夹 (这个需求是我家的nas,下载的视频,有写格式播放不了,手动去转有点麻烦,做了这个功能后以后自动扫描文件,就不用手动去转格式了 )
更多推荐
所有评论(0)