39
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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
39
39
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
39
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?