アニメーション作成方法

履歴

  • 2016-07-05 高橋芳幸 新規作成
  • 2018-07-30 高橋芳幸 更新
  • 2018-08-17 高橋芳幸 更新

スクリプト

複数ページの pdf ファイルを png ファイルに分割するスクリプトの例はこちら.

png ファイルからのアニメーション作成

$ ffmpeg -i figs/dcl_%06d.png -qscale 0 out.avi

or

$ avconv -i figs/dcl_%06d.png -qscale 0 out.avi

see also <URL:make_anim_okazakis>.

複数ページを含む pdf ファイルからのアニメーション作成

pdftk, pstoimg, ffmpeg を使用. (pstoimg の代わりに convert でも良い.) debian であれば, これらソフトウェアを使うにはそれぞれ pdftk, latex2html, ffmpeg パッケージをインストールすればよい.

$ mkdir figs-pdf figs-png

$ pdftk dcl.pdf cat 000001 output figs-pdf/dcl_000001.pdf
$ pstoimg -density 144 -flip r270 figs-pdf/dcl_000001.pdf -out figs-png/dcl_000001.png

$ pdftk dcl.pdf cat 000002 output figs-pdf/dcl_000002.pdf
$ pstoimg -density 144 -flip r270 figs-pdf/dcl_000002.pdf -out figs-png/dcl_000002.png

...

$ ffmpeg -i figs-png/dcl_%06d.png -qscale 0 out.avi

複数ページの pdf ファイルを png ファイルに分割するスクリプトの例はこちら.

ffmpeg のオプションについては, こちらを参照のこと.

debian での avi ファイルの再生には vlc パッケージをインストールすると良さそう.

動画の合成 (小窓に合成)

解像度などの情報取得

  • コマンド

    $ ffmpeg -i input.mp4

動画の不要部分を切る

  • コマンド

    $ ffmpeg -ss 0 -i combined_take7.mp4 -to 50.5 combined_take7_cut.mp4

    -ss 0 は冒頭 0 秒を切断, -to 50.5 はそこから 50.5 秒間で切断.

  • 参考
    • https://qiita.com/kitar/items/c4da996e358e39aa7c9b

サイズ変更

  • コマンド

    $ ffmpeg -i in.mp4 -vf scale=1280:-1 out.mp4

    動画の横幅(width)を 1280 にする. 高さ(height)は アスペクト比を維持して自動で設定する. -1:760 とすると高さを指定する

余計な部分をクリップ

  • コマンド

    $ ffmpeg -ss 1.5 -i input.mp4 -to 50 output.mp4

    最初の 1.5 秒から 50 秒分だけ切り出して保存

二つの動画を合成 (小窓に入れる)

  • コマンド

    $ ffmpeg -i parent.mp4 -vf "movie=child.mp4[inner]; [in][inner] overlay=910:440 [out]" combined.mp4
    • 上の例では parent.mp4 が「親動画」. child.mp4 が「小窓動画」
    • overlay は小窓を入れる位置. おそらく 910 が左からの距離. 440 が上からの距離.
    • (要パスワード)
  • 参考
    • https://qiita.com/riversun/items/d09d8e596a20ec1798f3

解像度変更 (もらった情報, 未確認)

  • コマンド

    $ ffmpeg -i input -s 1280x720 out.mp4

    1280x720に縮小。元の解像度だと1分100MBで過大です。

ゲインの調整 (もらった情報, 未確認)

  • コマンド

    $ ffmpeg -i input -vn -af volumedetect -f null -

    で音声のレベルを確認、max_volume が -14.3 db だったので0になるように ffmpeg -i input -af volume=10dB output (14.3にするつもりが間違って10になっていますが) 余計な部分を捨てること出来るので、録画ボタンを押したあとおもむろに開始すれば大丈夫です。

左右に並べる

単に左右に並べる

$ ffmpeg -i warm-bubble_hevi.avi -i warm-bubble_hevi.avi -filter_complex hstack out.avi
  • 左右に並べる方法の参考ページ
    • https://gist.github.com/0x0c/148c33ede66b074e0a05b4901c3e06fe
    • https://qiita.com/kuboyoo/items/33054e1ebb8b30d40766

左右に 3 つ並べる

$ ffmpeg \
   -i movie1.avi \
   -i movie2.avi \
   -i movie3.avi \
   -filter_complex "[0:v][1:v][2:v]hstack=inputs=3[v]" -map "[v]" \
   movie_all.avi

トリミングして左右に並べる

左の動画の右端を切って, 右の動画の左端を切って並べる. (

$ ffmpeg -i warm-bubble_hevi.avi -vf crop=in_w-200:in_h:0:0 hevi_crop.avi
$ ffmpeg -i warm-bubble_heve.avi -vf crop=in_w-100:in_h:100:0 heve_crop.avi
$ ffmpeg -i hevi_crop.avi -i heve_crop.avi -filter_complex hstack out_crop.avi
  • トリミングの参考ページ
    • https://w.atwiki.jp/kobapan/pages/173.html

タイル状に並べる (サイズ指定)

2x2

$ ffmpeg \
   -i movie11.avi \
   -i movie12.avi \
   -i movie21.avi \
   -i movie22.avi \
   -filter_complex \
   "[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2[v]" \
   -map "[v]" \
   movie_all.avi

2x2 (最後は白抜き)

$ ffmpeg \
   -i movie11.avi \
   -i movie12.avi \
   -i movie21.avi \
   -filter_complex \
   "color=white:2100x1484[c];[0:v][1:v]hstack=inputs=2[top];[2:v][c]hstack=inputs=2:shortest=1[bottom];[top][bottom]vstack=inputs=2[v]" \
   -map "[v]" \
   movie_all.avi

ただし, 2100x1484 は入力動画のサイズ.

タイル状に並べる (サイズ指定)

2x2

anim1.avi, anim2.avi, anim3.avi, anim4.avi を 2x2 に並べる.

$ ffmpeg -i anim1.avi -i anim2.avi -i anim3.avi -i anim4.avi \
  -filter_complex "
  nullsrc=size=640x480 [base];
  [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];
  [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
  [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
  [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
  [base][upperleft] overlay=shortest=1 [tmp1];
  [tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
  [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
  [tmp3][lowerright] overlay=shortest=1:x=320:y=240
  " \
  output.avi

3x2

anim1.avi, anim2.avi, anim3.avi, anim4.avi, anim5.avi, anim6.avi を 3x2 に並べる.

$ ffmpeg -i anim1.avi -i anim2.avi -i anim3.avi -i anim4.avi -i anim5.avi -i anim6.avi \
    -filter_complex "
    nullsrc=size=960x480 [base];
    [0:v] setpts=PTS-STARTPTS, scale=320x240 [11];
    [1:v] setpts=PTS-STARTPTS, scale=320x240 [12];
    [2:v] setpts=PTS-STARTPTS, scale=320x240 [13];
    [3:v] setpts=PTS-STARTPTS, scale=320x240 [21];
    [4:v] setpts=PTS-STARTPTS, scale=320x240 [22];
    [5:v] setpts=PTS-STARTPTS, scale=320x240 [23];
    [base][11] overlay=shortest=1 [tmp1];
    [tmp1][12] overlay=shortest=1:x=320 [tmp2];
    [tmp2][13] overlay=shortest=1:x=640 [tmp3];
    [tmp3][21] overlay=shortest=1:y=240 [tmp4];
    [tmp4][22] overlay=shortest=1:x=320:y=240 [tmp5];
    [tmp5][23] overlay=shortest=1:x=640:y=240
    " \
    output.avi

3x2

anim1.avi, anim2.avi, anim3.avi, anim4.avi, anim5.avi を 3x2 に並べる. 空いているところは白くする.

$ ffmpeg -i anim1.avi -i anim2.avi -i anim3.avi -i anim4.avi -i anim5.avi \
     -filter_complex "
     color=c=white:size=1920x960 [base];
     [0:v] setpts=PTS-STARTPTS, scale=640x480 [11];
     [1:v] setpts=PTS-STARTPTS, scale=640x480 [12];
     [2:v] setpts=PTS-STARTPTS, scale=640x480 [13];
     [3:v] setpts=PTS-STARTPTS, scale=640x480 [21];
     [4:v] setpts=PTS-STARTPTS, scale=640x480 [22];
     [base][11] overlay=shortest=1 [tmp1];
     [tmp1][12] overlay=shortest=1:x=640 [tmp2];
     [tmp2][13] overlay=shortest=1:x=1280 [tmp3];
     [tmp3][21] overlay=shortest=1:y=480 [tmp4];
     [tmp4][22] overlay=shortest=1:x=640:y=480
     " \
     output.avi