大家好,我是一名,跨境行业 saas 软件开发的前端程序员,阿毛
这个我的个人网站

在这里插入图片描述

用 Electron 从 0 开发一个桌面软件,决定做一个视频转码软件,第三天。

最近没什么空,公司让我改个JSP的项目,折腾了两天。前两天改的东西验收上线了, 现在来继续做做我的格式转换器。

前端的代码我都没有这么写,都是用deepseek 生成的,生成完之后我在改改。
今天做好了可以批量选择视频进行格式转换,可以设置存储路径。

  1. 这次主要遇到的有两个小问题
  • 本来以为在渲染进程通过 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)
                }
            })
        })
    })
}

  1. 文件存储路径的选择,我本来以为和 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,下载的视频,有写格式播放不了,手动去转有点麻烦,做了这个功能后以后自动扫描文件,就不用手动去转格式了 )
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐