英文:
How can I get the location of my screenshot made from video with ffmpeg in Node.js?
问题
这是我是如何做的。
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被触发');
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('发生错误: ' + err.message);
reject(err);
})
.on('end', () => {
console.log('成功生成缩略图');
fs.readFile(filename, (err, data) => {
if (err) {
console.error('读取缩略图文件时发生错误:', err);
reject(err);
return;
}
fs.unlink(filename);
uploadBuffer(data, filename, data.length)
})
resolve(filename);
})
.screenshots({
timestamps: [timePosition],
filename: filename,
folder: 'temp/',
size: '320x240',
});
});
}
这是生成的日志。
generateThumbnailFromVideo被触发
成功生成缩略图
createProjectMedia被触发
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
}
]
读取缩略图文件时发生错误: [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
文件夹。它是空的。
更新:检查并确认了用于“folder”键的路由器(temp/
)是正确的,因为删除该文件夹将触发错误,指示找不到文件夹。重新创建文件夹将删除此错误。但即使打印出“成功生成”的日志,图像也不会保存在该文件夹中,该文件夹在打印该日志后仍然为空。
那个fs.unlink
也与此无关。删除它不会造成任何变化。
英文:
This is how I did it.
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',
});
});
}
And this is the log came up.
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'
}
It claims the screenshot has been created but I cannot find it anywhere. Tried absolute route with __dirname
and os.tmpdir()
with no luck. The screenshot it claimed has been created are not there.
Can somebody help me out? I have been stuck here for 5 hours with no progress so far.
Also, I have checked the file temp
in the root directory of the repo. It is empty.
UPDATE: Checked and can confirm that the router used in the key "folder" (temp/
) is correct, since deleting that folder will trigger an error saying that the folder is not found. Creating the folder again will remove this error. But even though the "generated successfully" log is printed, the image is not saved in that folder, and the folder is still empty after that log is printed.
That fs.unlink
is also unrelated. Removing it won't cause any change.
答案1
得分: 1
为使此工作正常,您需要执行两个操作。
首先,将ffmpeg
函数的参数从流更改为文件路径。
ffmpeg({source: bufferToStream(mp4Buffer)})
=> ffmpeg("abc.mp4")
。
因为根据文档的说明,
它不适用于输入流
其次,在screenshot
方法中删除folder
属性,因为您已经在filename
变量中指定了指定的文件夹。
const filename = `temp/temp-${new Date().getTime()}.png`;
并且您的`screenshot`方法变为:
```javascript
.screenshots({
timestamps: [timePosition],
filename: filename,
size: '320x240',
});
英文:
To make this work, you are required to do two things.
First, change the argument of ffmpeg
fuction, from a stream to a file path.
ffmpeg({source: bufferToStream(mp4Buffer)})
=> ffmpeg("abc.mp4")
.
Because according to docs,
> It will not work on input streams
Second, remove the folder
property from screenshot
method, as you've already specified designated folder in filename
variable.
const filename = `temp/temp-${new Date().getTime()}.png`;
and your screenshot
method becomes:
.screenshots({
timestamps: [timePosition],
filename: filename,
size: '320x240',
});
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论