簡體   English   中英

使用 fluent-ffmpeg 判斷文件是視頻還是音頻

[英]Use fluent-ffmpeg to tell if a file is a video or audio

我在 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 64 位和 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 命令行來找出它?

我建議為此使用 ffprobe,它有一個很好的模塊,稱為node-ffprobe

希望有幫助!

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

示例代碼:

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

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

通過這種方式,您可以方便地檢查分辨率/編解碼器或其他流屬性以區分彼此。

希望這對使用更新庫的任何人都有幫助。

我不確定您使用的是哪個版本的 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

如果您確實找到了更聰明的解決方案,請告訴我! :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM