使用fluent-ffmpeg来判断文件是video还是audio

我在NodeJS中使用node-fluent-ffmpeg模块。 fluent-ffmpeg提供获取video和audio文件的元数据的function是非常好的。

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

我曾尝试在Mac OS上使用元数据中的“分辨率”属性来判断一个文件是否只是audio或video,即如果resolution.w和resolution.h都是0,那么这个文件就是一个audio文件。 这项工作在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 } 

我不是为什么有一个“决议”,因为它是一个纯粹的audio文件。 那么是否有任何可靠的方法来查明该文件是仅audio还是来自元数据的video? 或者我应该使用ffmpeg命令行来找出它?

我build议使用ffprobe来做这件事,这里有个叫做node-ffprobe的好模块

希望有所帮助!

我不确定你使用的是什么版本的fluent-ffmpeg,也没有在Windows平台上testing过; 我刚开始使用fluent-ffmpeg,我提供的解决scheme是基于我的观察。 首先我们使用下面的代码来访问元数据。

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

既然它显示分辨率不pipe什么,即使它是一个纯audio文件。 从观察两个文件,一个audio文件和一个video文件,这里是我发现的有关audio文件[我只粘贴下面的audio输出]

 { ffmpegversion: '1.2.1', title: 'juicy-r [the notorious big 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 ,那么你知道这是一个audio文件。 此外,audio文件有一个额外的属性“渠道”,所以你可以尝试检查,看看它是否存在if(metadata.audio.channels)...并希望这与testing返回true

如果你find一个更聪明的解决scheme,请让我知道! 🙂

你可以使用包“node-ffprobe”来做这个。

示例代码:

 var probe = require('node-ffprobe'); var track = '<ENTER FILE PATH>'; probe(track, function(err, probeData) { console.log(probeData); });