如何在Node.js中获取我使用ffmpeg从视频中截取的屏幕截图的位置?

uz75evzq  于 2023-06-22  发布在  Node.js
关注(0)|答案(1)|浏览(199)

我就是这么做的。

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'
}

它声称截图已经创建,但我找不到它的任何地方。使用__dirnameos.tmpdir()尝试绝对路由,但没有成功。它声称已经创建的屏幕截图并不存在。
有人能帮帮我吗?我已经在这里呆了5个小时了,到目前为止没有任何进展。
此外,我还检查了存储库根目录中的文件temp。它是空的。
更新:已检查并可以确认密钥“文件夹”(temp/)中使用的路由器是正确的,因为删除该文件夹将触发错误,称未找到该文件夹。重新创建文件夹将删除此错误。但是,即使打印了“生成成功”的日志,图像也不会保存在该文件夹中,并且在打印该日志后,该文件夹仍然是空的。
fs.unlink也是不相关的。移除它不会引起任何变化。

qij5mzcb

qij5mzcb1#

要做到这一点,你需要做两件事。
首先,将ffmpeg函数的参数从流改为文件路径。ffmpeg({source: bufferToStream(mp4Buffer)}) => ffmpeg("abc.mp4")。因为根据docs
它将不适用于输入流
其次,从screenshot方法中删除folder属性,因为您已经在filename变量中指定了指定的文件夹。

const filename = `temp/temp-${new Date().getTime()}.png`;

然后你的screenshot方法变成:

.screenshots({
        timestamps: [timePosition],
        filename: filename,
        size: '320x240',
    });

相关问题