Получить разрешение видео в nodejs

Я пытался получить ответ на этот вопрос, не найдя. Извините, если это звучит глупо или очевидно.

У меня есть приложение nodejs, и в основном я хотел бы просто получить разрешение видео. Представьте, что у меня есть фильм, хранящийся на диске, и я хотел бы узнать, записан ли он в формате 720p, 1080p или где-либо еще.

Я понял, что мне может понадобиться использовать ffmpeg для этого, но потом я также понял, что ffmpeg в основном использовался для "записи, конвертации и потоковой передачи аудио и видео файлов". Это не значит восстановить разрешение видео.

Спасибо за помощь

Редактирование 1: приложение node.js является настольным приложением и должно быть переносимым на Linux, Windows и OS X. Если это возможно, переносимый ответ был бы более ценным, но, конечно, любой ответ приветствуется.

3 ответа

Решение

Честно говоря, я думаю, что лучший способ, который я нашел, это использовать fluent-ffmpeg с ffprobe, так как вы можете указать путь к исполняемому файлу. Единственная проблема заключается в том, что ffmpeg должен поставляться вместе с приложением. Таким образом, должны быть отправлены разные исполняемые файлы, по одному для каждого дистрибутива / os / происхождения. Если у кого-то есть что-то лучше, я открыт для ответов.

Получение ширины, высоты и соотношения сторон с помощью fluent-ffmpeg выполняется следующим образом:

var ffmpeg = require('fluent-ffmpeg');

ffmpeg.setFfprobePath(pathToFfprobeExecutable);

ffmpeg.ffprobe(pathToYourVideo, function(err, metadata) {
    if (err) {
        console.error(err);
    } else {
        // metadata should contain 'width', 'height' and 'display_aspect_ratio'
        console.log(metadata);
    }
});

Есть npm пакет называется get-video-dimensions которые также используют ffprobe и это намного проще в использовании. Он также поддерживает обещания и async/await.

import getDimensions from 'get-video-dimensions';

Используя обещание:

getDimensions('video.mp4').then(dimensions => {
  console.log(dimensions.width);
  console.log(dimensions.height);
})

или async / await:

const dimensions = await getDimensions('video.mp4');
console.log(dimensions.width);
console.log(dimensions.height);

Я использую node-ffprobe, чтобы выполнить это для изображений:

var probe = require('/usr/lib/node_modules/node-ffprobe');
probe(filePath, function (err, data) {
    //the 'data' variable contains the information about the media file
});

fileMetaData будет иметь ширину, высоту, информацию о кодеке, соотношение сторон и т. д.

const ffprobe = require('ffprobe')
const ffprobeStatic = require('ffprobe-static')
const fileMetaData = await ffprobe(fileName, { path: ffprobeStatic.path })

Имя файла может быть видео ('webm', 'mov', 'wmv', 'mpg', 'mpeg', 'mp4','flv' и т. д.) или путем к изображению (jpg, gif, png и т. д.). Пример fileName: /path/to/video.mp4 или http://example.com/video.mp4

Один из способов сделать это - запустить другое приложение как дочерний процесс и получить разрешение от std out. Я не знаю ни о каком чистом решении node.js для этого.

Увидеть child_process.exec https://nodejs.org/api/child_process.html

а также ffprobe Как я могу получить разрешение (ширину и высоту) для видеофайла из командной строки Linux?

Другие вопросы по тегам