Сделайте скриншот из видео в node js - PullRequest
0 голосов
/ 06 марта 2020

Я пишу 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);
  }
}
...