我就是这么做的。
const ffmpegPath = require('@ffmpeg-installer/ffmpeg');
import ffmpeg from 'fluent-ffmpeg';
import path from 'path';
const os = require('os');
ffmpeg.setFfmpegPath(ffmpegPath.path);
export const generateThumbnailFromVideo = async (mp4Buffer) => {
console.log('generateThumbnailFromVideo is triggered');
const timePosition = '00:00:00.500';
const filename = `temp/temp-${new Date().getTime()}.png`;
return new Promise((resolve, reject) => {
ffmpeg({
source: bufferToStream(mp4Buffer)
})
.on('error', (err) => {
console.error('An error occurred: ' + err.message);
reject(err);
})
.on('end', () => {
console.log('Thumbnail generated successfully');
fs.readFile(filename, (err, data) => {
if (err) {
console.error('An error occurred while reading the thumbnail file:', err);
reject(err);
return;
}
fs.unlink(filename);
uploadBuffer(data, filename, data.length)
})
resolve(filename);
})
.screenshots({
timestamps: [timePosition],
filename: filename,
folder: 'temp/',
size: '320x240',
});
});
}
这是记录出来的。
generateThumbnailFromVideo is triggered
Thumbnail generated successfully
createProjectMedia is triggered
userId: 1
projectId: 25
mediaArray: [
{
mediaUrl: 'medias/1/1686843801535/medias_1_1684753043519_1_(1)_(4)_(1).mp4',
thumbnailUrl: 'medias/1/1686843801535/medias_1_1684753043519_1_(1)_(4)_(1)_thumbnail.jpg',
mediaType: 2
}
]
An error occurred while reading the thumbnail file: [Error: ENOENT: no such file or directory, open 'temp/temp-1686843802255.png'] {
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: 'temp/temp-1686843802255.png'
}
它声称截图已经创建,但我找不到它的任何地方。使用__dirname
和os.tmpdir()
尝试绝对路由,但没有成功。它声称已经创建的屏幕截图并不存在。
有人能帮帮我吗?我已经在这里呆了5个小时了,到目前为止没有任何进展。
此外,我还检查了存储库根目录中的文件temp
。它是空的。
更新:已检查并可以确认密钥“文件夹”(temp/
)中使用的路由器是正确的,因为删除该文件夹将触发错误,称未找到该文件夹。重新创建文件夹将删除此错误。但是,即使打印了“生成成功”的日志,图像也不会保存在该文件夹中,并且在打印该日志后,该文件夹仍然是空的。fs.unlink
也是不相关的。移除它不会引起任何变化。
1条答案
按热度按时间qij5mzcb1#
要做到这一点,你需要做两件事。
首先,将
ffmpeg
函数的参数从流改为文件路径。ffmpeg({source: bufferToStream(mp4Buffer)})
=>ffmpeg("abc.mp4")
。因为根据docs它将不适用于输入流
其次,从
screenshot
方法中删除folder
属性,因为您已经在filename
变量中指定了指定的文件夹。然后你的
screenshot
方法变成: