Полное руководство: сжатие видео в Node.js

Сжатие видео — важный шаг в оптимизации размеров файлов и расширении возможностей потоковой передачи. В этом подробном руководстве мы рассмотрим различные методы сжатия видео с помощью Node.js. Мы рассмотрим несколько библиотек и методов, попутно предоставляя примеры кода. Давайте погрузимся!

  1. FFmpeg:
    FFmpeg — это мощная мультимедийная платформа, поддерживающая сжатие видео. Вы можете выполнять команды FFmpeg из Node.js, используя модуль child_process. Вот пример:
const { exec } = require('child_process');
const compressVideo = (inputFile, outputFile) => {
  const command = `ffmpeg -i ${inputFile} -codec:v libx264 -crf 23 -preset medium -codec:a aac -b:a 128k ${outputFile}`;
  exec(command, (error, stdout, stderr) => {
    if (error) {
      console.error(`Error compressing video: ${error}`);
      return;
    }
    console.log('Video compression completed successfully!');
  });
};
compressVideo('input.mp4', 'output.mp4');
  1. fluent-ffmpeg:
    Библиотека fluent-ffmpeg обеспечивает более удобный способ использования FFmpeg в Node.js. Он предлагает API более высокого уровня и упрощает процесс сжатия видео. Вот пример:
const ffmpeg = require('fluent-ffmpeg');
const compressVideo = (inputFile, outputFile) => {
  ffmpeg(inputFile)
    .output(outputFile)
    .videoCodec('libx264')
    .audioCodec('aac')
    .audioBitrate('128k')
    .outputOptions(['-crf 23', '-preset medium'])
    .on('end', () => {
      console.log('Video compression completed successfully!');
    })
    .on('error', (error) => {
      console.error(`Error compressing video: ${error.message}`);
    })
    .run();
};
compressVideo('input.mp4', 'output.mp4');
  1. Handbrake-CLI:
    Handbrake-CLI — это интерфейс командной строки для популярного транскодера видео Handbrake. Он обеспечивает отличные возможности сжатия. Вот пример использования Handbrake-CLI с Node.js:
const { exec } = require('child_process');
const compressVideo = (inputFile, outputFile) => {
  const command = `HandbrakeCLI -i ${inputFile} -o ${outputFile} --preset="Fast 1080p"`;
  exec(command, (error, stdout, stderr) => {
    if (error) {
      console.error(`Error compressing video: ${error}`);
      return;
    }
    console.log('Video compression completed successfully!');
  });
};
compressVideo('input.mp4', 'output.mp4');
  1. fluent-ffmpeg + AWS Lambda:
    Если вы работаете с большими видеофайлами, вы можете столкнуться с ограничениями памяти на сервере Node.js. В таких случаях вы можете использовать AWS Lambda, чтобы разгрузить процесс сжатия. Вот пример использования fluent-ffmpeg и AWS Lambda:
const ffmpeg = require('fluent-ffmpeg');
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event) => {
  const inputFile = event.inputFile;
  const outputFile = event.outputFile;
  const command = ffmpeg(inputFile)
    .output(outputFile)
    .videoCodec('libx264')
    .audioCodec('aac')
    .audioBitrate('128k')
    .outputOptions(['-crf 23', '-preset medium'])
    .on('error', (error) => {
      console.error(`Error compressing video: ${error.message}`);
    });
  const outputStream = command.pipe();
  const params = {
    Bucket: 'your-bucket-name',
    Key: outputFile,
    Body: outputStream,
  };
  await s3.upload(params).promise();
  console.log('Video compression completed successfully!');
};

Сжатие видео необходимо для уменьшения размера файлов и оптимизации потоковой передачи. В этой статье мы рассмотрели различные методы сжатия видео в Node.js, включая FFmpeg, fluent-ffmpeg, Handbrake-CLI и AWS Lambda. Каждый метод имеет свои уникальные особенности и преимущества. Включив эти методы в свои приложения Node.js, вы сможете эффективно сжимать видео и улучшать общее взаимодействие с пользователем.

Не забудьте оценить свои конкретные требования и выбрать метод, который лучше всего соответствует вашим потребностям. Удачного сжатия видео!