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で縦は可変
});
count
を4
とすると、20%、40%、60%、80%の位置で撮ってくれます。
count
の代わりにtimemarks
を使うと、何分何秒という決め打ち指定も可能。
終了イベント
サムネイル抽出は非同期処理なので、終了イベントもちゃんと取れます。
サムネイル存在確認
command.on('end', () => {
console.log(fs.existsSync('tn.png')) // true
}).screenshots();
console.log(fs.existsSync('tn.png')) // false