Я пишу API, где храню видеофайлы в GridFS mongoDB. Поскольку в GridFS хранится много видео, я хотел бы делать миниатюры или снимки экрана каждый раз, когда пользователь загружает видео (и сохраняет снимок экрана в mongoDB) до или после сохранения видео в gridFS, и когда я хочу показать все видео, я я не хочу загружать их все из gridFS сразу, так как это может занять слишком много времени, если у меня хранится много видео, я хотел бы показать миниатюры, а когда пользователь нажимает на одну из миниатюр, я получаю видео данные из сетки фс и скачайте. Я посмотрел на эти npm пакеты fluent-ffmpeg, thumbsupply и media-thumbnail, и все они, кажется, требуют абсолютных или относительных путей к файлам вместо gridFS. Мне интересно, есть ли способ сделать эскиз или скриншот из видео до или после его сохранения в gridFS.
const storage = new GridFsStorage({
url: constants.MONGO_URL,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err);
}
const fileInfo = {
filename: buf.toString('hex') + req.user._id + Date.now(),
bucketName: 'videoPostUploads',
};
resolve(fileInfo);
});
});
},
});
const fileFilter = (req, file, cb) => {
if (file.mimetype.startsWith('video')) {
cb(null, true);
} else {
req['uploadError'] = 'File is not a video';
cb(null, false);
}
};
export const upload = multer({
storage: storage,
fileFilter: fileFilter,
}).single('file');
export async function createVideoPost(req, res, next) {
if (req.file) {
try {
return res
.status(HTTPStatus.CREATED)
.json(
await post.createPost(body, req.file.filename, req.user._id),
);
} catch (err) {
err.status = HTTPStatus.BAD_REQUEST;
return next(err);
}
} else {
return res.status(HTTPStatus.BAD_REQUEST).json({ err: req.uploadError });
}
}
// Downloading a single file
export async function getVideoPostById(req, res, next) {
try {
const videoPost = await post.findById(req.params.id)
.populate('user');
if (!videoPost) return res.sendStatus(HTTPStatus.BAD_REQUEST);
try {
// Defined collection name to lookup into
const gfsvideoPostUploads = new mongoose.mongo.GridFSBucket(
mongoose.connection.db,
{
chunkSizeBytes: 1024,
bucketName: 'videoPostUploads',
},
);
try {
return await gfsvideoPostUploads
.openDownloadStreamByName(videoPost.videoFileName)
.pipe(res);
} catch (err) {
err.status = HTTPStatus.INTERNAL_SERVER_ERROR;
return next(err);
}
} catch (err) {
err.status = HTTPStatus.BAD_REQUEST;
return next(err);
}
} catch (err) {
err.status = HTTPStatus.BAD_REQUEST;
return next(err);
}
}