使用fluent-ffmpeg判断文件是视频还是音频

时间:2012-09-12 14:24:59

标签: node.js audio video ffmpeg

我在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命令行找到它?

4 个答案:

答案 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)

通过这种方式,您可以方便地检查分辨率/编解码器或其他流属性,以告诉彼此。

希望这对使用更新库的任何人都有用。