在nodejs中获取视频分辨率

Get video resolution in nodejs

我一直试图找到这个问题的答案,但没有真正找到任何答案。如果这听起来很愚蠢或显而易见,请原谅。

我有一个 nodejs 应用程序,基本上我想简单地获取视频的分辨率。想象一下,我将电影存储在磁盘上,我想知道它是 720p 还是 1080p 或其他格式。

我了解到我可能需要使用 ffmpeg 来这样做,但后来我也了解到 ffmpeg 主要用于 "record, convert and stream audio and video files"。 这并不意味着检索视频分辨率。

感谢您的帮助

编辑 1: node.js 应用程序是一个桌面应用程序,需要可移植到 Linux、windows 和 OS X。如果可能的话,一个可移植的答案会更受欢迎,但当然任何答案欢迎。

一种方法是 运行 另一个应用程序作为子进程,并从 std 输出中获取分辨率。我不知道有任何纯粹的 node.js 解决方案。

参见 child_process.exec https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

ffprobe How can I get the resolution (width and height) for a video file from a linux command line?

老实说,我认为我发现的最佳方法是将 fluent-ffmpeg 与 ffprobe 一起使用,因为您可以设置可执行文件的路径。唯一的问题是 ffmpeg 必须随应用程序一起提供。因此必须运送不同的可执行文件,每个 distribution/os/derivation 一个。如果有人有更好的答案,我愿意回答。

使用 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);
    }
});

我使用 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
});

有一个名为 get-video-dimensionsnpm 包也使用了 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);

fileMetaData 将具有宽度、高度、编解码器信息、纵横比等...

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

fileName could be video('webm', 'mov', 'wmv', 'mpg', 'mpeg', 'mp4','flv' etc..) or image(jpg, gif, png etc..) path. fileName example: /path/to/video.mp4 or http://example.com/video.mp4