我正尝试在我的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,但没有任何效果。
1条答案
按热度按时间hfyxw5xn1#
您没有正确使用
contextBridge
。首先,
contextBridge
的第二个参数应该是一个对象,而不是一个函数:字符串
然后,您只能从
window
访问它:型
另外请记住,预加载默认为
sandboxed
,这意味着除非您在窗口的webPreferences
中禁用sandbox
,否则您不能在预加载中要求ffmpeg模块。如果你想保留沙箱(因为它是一个安全功能),你需要使用IPC在渲染器进程和主进程(你可以在其中需要模块)之间进行通信。