electron 我如何使用ffmpeg在我的渲染过程中电子?

muk1a3rh  于 2023-08-01  发布在  Electron
关注(0)|答案(1)|浏览(186)

我正尝试在我的electron应用程序的渲染过程中使用ffmpeg。我在preload.js文件中公开模块如下:

const { contextBridge, ipcRenderer } = require('electron');
const ffmpegStatic = require('ffmpeg-static');
const ffmpeg = require('fluent-ffmpeg');
// make ffmpeg available as a function in the renderer process
contextBridge.exposeInMainWorld('ffmpeg', () => ffmpeg(ffmpegStatic.path));

字符串
我尝试在renderer.js文件中访问它,如下所示:

video.addEventListener('change', (event) => {
    const file = event.target.files[0];
    const filePath = file.path;
    const fileName = file.name;
    const fileExt = fileName.split('.').pop();
    const newFileName = fileName.replace(fileExt, 'mp4');
    const newFilePath = filePath.replace(fileName, newFileName);

    // Run FFmpeg
    ffmpeg()

        // Input file
        .input(filePath)

        // Audio bit rate
        .outputOptions('-ab', '192k')

        // Output file
        .saveToFile(newFilePath)

        // Log the percentage of work completed
        .on('progress', (progress) => {
            if (progress.percent) {
                console.log(`Processing: ${Math.floor(progress.percent)}% done`);
            }
        })

        // The callback that is run when FFmpeg is finished
        .on('end', () => {
            console.log('FFmpeg has finished.');
        })

        // The callback that is run when FFmpeg encountered an error
        .on('error', (error) => {
            console.error(error);
        });
});


但随后我在控制台中得到以下错误:未捕获的类型错误:ffmpeg(...).input不是HTMLInputElement中的函数。我真的不知道该怎么解决这个问题,有人能帮我吗?
我试着用不同的方式编写它,并在我的rendere.js中定义ffmpeg,但没有任何效果。

hfyxw5xn

hfyxw5xn1#

您没有正确使用contextBridge
首先,contextBridge的第二个参数应该是一个对象,而不是一个函数:

contextBridge.exposeInMainWorld('ffmpeg', {
  doSomething: () => ffmpeg(ffmpegStatic.path)
})

字符串
然后,您只能从window访问它:

window.ffmpeg.doSomething();


另外请记住,预加载默认为sandboxed,这意味着除非您在窗口的webPreferences中禁用sandbox,否则您不能在预加载中要求ffmpeg模块。如果你想保留沙箱(因为它是一个安全功能),你需要使用IPC在渲染器进程和主进程(你可以在其中需要模块)之间进行通信。

相关问题