我在NodeJS中使用node-fluent-ffmpeg模块。 fluent-ffmpeg提供了获取视频和音频文件元数据的功能,这是非常好的。
https://github.com/schaermu/node-fluent-ffmpeg#reading-video-metadata
我已尝试在Mac OS上使用元数据中的“resolution”属性来判断文件是仅音频还是视频,即如果resolution.w和resolution.h都为0,则此文件为音频。这在Mac OS上运行良好。但是有些奇怪的事情发生在Windows平台上(我尝试使用Windows 7 64位和Windows 2008)不能使用最新的ffmpeg。即使我通过fluent-ffmpeg输入.mp3文件,结果看起来像这样:
video:
{
container:'mp3',
...
resolution: {w:300,h:300},
resolutionSquare: {w:300,h:300},
aspectString: '1:1',
...
}
audio:
{
codec:'mp3',
bitrate:64,
sample_rate:44100,
stream:0,
channels:1
}
我不是为什么有“分辨率”,因为它是一个纯音频文件。那么,是否有任何可靠的方法来确定文件是仅音频还是来自元数据的视频?或者我应该使用ffmpeg命令行找到它?
答案 0 :(得分:1)
我建议使用ffprobe这个,有一个很好的模块叫做node-ffprobe
希望有所帮助!
答案 1 :(得分:0)
我不确定您使用的是什么版本的fluent-ffmpeg,我也没有在Windows平台上测试过这个版本;我今天刚开始使用fluent-ffmpeg,我提供的解决方案基于我的观察。首先,我们使用下面的代码来访问元数据。
var source = 'vids/source.mp3';
var ffmpeg = require('fluent-ffmpeg');
var Metalib = require('fluent-ffmpeg').Metadata;
var metaObject = new Metalib(source, function(metadata, err) {
console.log(metadata);
});
因为它无论如何都显示分辨率,即使它是纯音频文件。通过观察两个文件,一个音频文件和一个视频文件,这里是我发现的音频文件 [我只粘贴下面的音频输出] 。
{ ffmpegversion: '1.2.1',
title: 'juicy-r [the notorious b.i.g. vs. the xx]',
artist: 'wait what',
album: 'the notorious xx',
track: '2/11',
date: '2010',
durationraw: '00:04:07.94',
durationsec: 247,
synched: true,
major_brand: undefined,
video:
{ container: 'mp3',
bitrate: 127,
codec: 'mjpeg',
resolution: { w: 1425, h: 1416 },
resolutionSquare: { w: 1425, h: 1416 },
rotate: 0,
fps: 0,
stream: 0,
aspectString: '475:472',
aspect: 1.00635593220339,
pixelString: '1:1',
pixel: 1 },
audio:
{ codec: 'mp3',
bitrate: 128,
sample_rate: 44100,
stream: 0,
channels: 2 } }
基本上,假设if(metadata.video.fps)
返回 false ,那么您就知道它是一个音频文件。此外,音频文件还有一个额外的属性“频道”,因此您可以尝试检查它是否存在if(metadata.audio.channels)...
并希望通过该测试返回 true
如果您确实找到了更聪明的解决方案,请告诉我们! : - )
答案 2 :(得分:0)
您可以使用包'node-ffprobe'来实现此目的。
示例代码:
var probe = require('node-ffprobe');
var track = '<ENTER FILE PATH>';
probe(track, function(err, probeData) {
console.log(probeData);
});
答案 3 :(得分:0)
自 fluent-ffmpeg 2.0 起,您不需要其他软件包。
元数据子模块已被 ffprobe()方法替换。
它的用法如下:
ShowWindow(ToolsWindow)
通过这种方式,您可以方便地检查分辨率/编解码器或其他流属性,以告诉彼此。
希望这对使用更新库的任何人都有用。