LoginSignup
38
38

More than 5 years have passed since last update.

Node.jsでffmepgを使って動画からサムネイル/静止画を生成する

Posted at

Node.jsで動画ファイルから静止画を生成する必要があったんで、調べてみたよ

ffmpegをインストール

執筆時点では3.0がリリースされたばかり。
brewにあるのは2.8.6だったけどこれで良しとする。インストール。

$ brew install ffmpeg

fluent-ffmpegをインストール

nodeからffmpegを使うために抽象化ライブラリfluent-ffmpegを使う。
多分これが一番早いと思います

$ npm install --save fluent-ffmpeg

JSを書く

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

const command = ffmpeg('video.mp4');

ffmpeg関数に変換元となる動画ファイルへのパスもしくはストリームを渡してあげると、commandオブジェクトを返してもらえます。
コイツを使ってエンコードやらサムネ抽出やらをしていく流れになります

いざサムネイル抽出

サムネイル抽出の最小構成
command.screenshots();

これだけでカレントディレクトリにtn.pngという名前で静止画を作ってくれます。
ここまで3行。簡単すぎますね
デフォルトでは動画時間の50%の位置を撮ってくるようです
オプションを指定することで、取得位置、ファイル名、保存場所、静止画サイズを変更可能

サムネイル抽出のオプションいろいろ
command.screenshots({
    count: 4,
    folder: path.join(__dirname, 'thumbnails'), // pathは別途requireしてね
    filename: 'thumb-%i:%s.png', // %iはインデックス番号、%sは秒
    size: '320x?' // 幅320で縦は可変
});

count4とすると、20%、40%、60%、80%の位置で撮ってくれます。
countの代わりにtimemarksを使うと、何分何秒という決め打ち指定も可能。

終了イベント

サムネイル抽出は非同期処理なので、終了イベントもちゃんと取れます。

サムネイル存在確認
command.on('end', () => {
    console.log(fs.existsSync('tn.png')) // true
}).screenshots();
console.log(fs.existsSync('tn.png')) // false
38
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
38