4

我在 NodeJS 中使用 node-fluent-ffmpeg 模块。fluent-ffmpeg 提供了获取视频和音频文件元数据的功能非常好。

https://github.com/schaermu/node-fluent-ffmpeg#reading-video-metadata

我曾尝试在 Mac OS 上使用元数据中的“分辨率”属性来判断文件是纯音频还是视频,即如果 resolution.w 和 resolution.h 均为 0,则该文件是音频。这在 Mac OS 上运行良好。但是发生了一些奇怪的事情,这在使用最新 ffmpeg 的 Windows 平台(我尝试过 Windows 7 64bit 和 Windows 2008)上不起作用。即使我通过 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

4 回答 4

2

我建议为此使用 ffprobe,有一个不错的模块,称为node-ffprobe

希望有帮助!

于 2013-01-02T01:45:44.673 回答
2

您可以为此使用包“node-ffprobe”。

示例代码:

var probe = require('node-ffprobe');
var track = '<ENTER FILE PATH>';
probe(track, function(err, probeData) {
 console.log(probeData);
});
于 2016-08-11T07:17:05.340 回答
1

fluent-ffmpeg 2.0 开始,你不需要另一个包。

元数据子模块被ffprobe()方法取代。

它是这样使用的:

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

ffmpeg('/path/to/file.avi').ffprobe(function(err, data) {
  console.dir(data.streams);
  console.dir(data.format);
});

ffmpeg.ffprobe('/path/to/file.avi', function(err, data) {
  console.dir(data.streams);
  console.dir(data.format);
});

这样,您可以方便地检查分辨率/编解码器或其他流属性以区分彼此。

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

于 2020-07-11T17:10:25.343 回答
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

如果您确实找到了更聪明的解决方案,请告诉我!:-)

于 2013-12-03T02:43:26.240 回答