LoginSignup
7
7

More than 3 years have passed since last update.

p5.jsで作ったジェネラティブアートをtwitterに動画で貼り付ける際のメモ

Last updated at Posted at 2020-09-07

本メモの結論

ffmpegを使って連番pngを結合して動画を作成するとよさそう。
もっといいやり方あるのかもだけど、この方法である程度改善はしたのでメモを残しておく。

Canvasのpngを連番で保存

このsavePicture()draw()の一番最後に入れます。適切なmaxCountを設定してください。
※大量に画像が保存されることになるので、ご注意!
また、私のPCの様に非力だとなぜか出力されないフレームが出てくるので、その場合はsetup()内でframeRate(5)とかでフレームレート落として実行してください。

let count = 0;
const savePicture = ( maxCount = 10 ) => {

  save( ( '' + count ).padStart( 3, '0' ) + '.png' );
  count++;
  if( count > maxCount ){
    noLoop()
  }

}

連番pngをffmpegで結合しmp4化

ffmpeg.exe -r 30 -i ~/Downloads/%03d.png -vcodec libx264 -pix_fmt yuv420p -r 30 out.mp4

結論に至るまで

背景

最近、p5.jsでジェネラティブアートを作って遊んでいるのですが、特に動きのある作品を動画としてtwitterに投稿したときに、自動的に圧縮され非常に残念な結果となります。↓はびっくりするぐらい汚い絵になった例。

これは、Windows PCの画面キャプチャでも、iPhone/iPadの画面キャプチャでもどちらでも発生しており、最初はこんなものかなと思っていましたが、他の皆様の投稿を見ていると、キレイに動画を投稿できている方が多いので解はあるはずだと思い、調査を始めました。

解決していそうな方のコメント

なんかtwitterの動画がひどく圧縮されないための条件が複数あるらしいのですが、画サイズを720以下にする以外は動画の設定を細かく調整する必要がありそうです。面倒なので、その辺をケアできているffmepgの神コマンド落ちていないかなと検索した結果見つけました。↓

ただ、デフォルトではp5.jsには連番の画像出力機能はないと思うので、上述の関数を作って連番PNGを出力できるようにしてからトライしました。

やってみた

対応前後の動画を比較します。

Before

こちらはiPadの画面キャプチャをトリミングしたそのままの動画。若干ノイジーに感じます。

After

コチラが今回の方法で出力した動画。すこしだけキレイになめらかに表示されています!

別の動画も投稿してみましたが、まずまずのなめらかさな気がする。とりあえず、継続して試してみよう。

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