4

NodeJSでnode-fluent-ffmpegモジュールを使用しています。fluent-ffmpegがビデオとオーディオファイルのメタデータを取得する関数を提供することは非常に良いことです。

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

Mac OSで、メタデータの「resolution」属性を使用して、ファイルがオーディオのみかビデオかを判断しようとしました。つまり、resolution.wとresolution.hの両方が0の場合、このファイルはオーディオです。これはMacOSで正常に動作します。しかし、最新のffmpegを使用しているWindowsプラットフォーム(私はWindows 764ビットとWindows2008を試しました)ではこれが機能しないという奇妙なことが起こりました。.mp3ファイルをfluent-ffmpegに入れても、結果は次のようになります。

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

純粋なオーディオファイルであっても、何があっても解像度が表示されるので。オーディオファイルとビデオファイルの2つのファイルを観察したところ、オーディオファイルについて次のことがわかりました[以下のオーディオ出力のみを貼り付けました]

{ 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 } }

基本的に、 falseif(metadata.video.fps)を返すと仮定すると、それがオーディオファイルであることがわかります。また、オーディオファイルには追加のプロパティ「channels」が含まれているため、存在するかどうかを確認して、そのテストでtrueが返されることを期待できます。if(metadata.audio.channels)...

もっと賢い解決策を見つけたら、私に知らせてください!:-)

于 2013-12-03T02:43:26.240 に答える