読者です 読者をやめる 読者になる 読者になる

Q068891のメモ帳

気が向いたときにLinuxだったり、プログラムだったり、適当なメモをざっくばらんに書いてます。

Linuxで画像ファイルからパラパラ動画作成

シミュレーションやってる人とかだと、シミュレーション結果などを可視化するために、
シミュレーションのステップごとの画像ファイルを作成して、その画像ファイルから動画を作成したい場合があるかもしれません。目視確認したい時とか、発表で動画をどーんと出したいときとか。

以下、Linuxでやる方法を紹介します。

今回紹介する方法は、画像ファイルの名前を 01.png、02.png... の様に頭に0がついていないときちんと順番を認識してくれません
また、最大の桁数のファイルが100.pngの場合は0を2個以上(例 001.png)、1000.pngの場合は0を3つ以上(例:0001.png)というように、0の数を変えなければいけません。
1.png、 2.pngのようなファイルの場合は読み込めないので、そんな感じのファイル名にしてしまっていた場合は、適当に下記みたいなスクリプト等でファイル名を変更してからやってあげれば良いと思います。

ファイル名整理

※単にmvして名前変更しているだけ(笑 (こんなもん書くまでも無いかもですね、、、)

#!/bin/sh
seed=0
while [ $seed -le 9 ]
do
  mv $seed.png 000$seed.png
  seed=`expr $seed + 1`
done

while [ $seed -le 99 ]
do
  mv $seed.png 00$seed.png
  seed=`expr $seed + 1`
done

while [ $seed -le 999 ]
do
  mv $seed.png 0$seed.png
  seed=`expr $seed + 1`
done

ファイル名を先頭に0がついた連番にしたら準備完了です。
下記の方法1、2どちらかの方法で動画を作成していきます。2がおすすめです。

方法1:convertコマンドを使う

画像ファイルがあるディレクトリで以下のコマンドを実行すると、
hoge.aviというファイル名の動画ができます。

$ convert -delay 100 *.png out.mpg

ちなみに
$ convert -delay 100 *.png hoge.avi
でavi形式の動画もできる。

delayはパラパラ動画の1枚を表示させる速度。上の例だと1秒ごとに1枚表示されます。

※注意
この方法は、読み込ませる画像の総容量が大きいとすぐにエラーをはいて途中で強制終了してしまいます。
また、完成した動画のスクロールバーがおかしな挙動をすることがあります。。。(経験談&原因不明)

方法2:ffmpegコマンドを使う おすすめ!

※この方法だと方法1の問題は発生し難い気がします(経験則)

画像ファイルがあるディレクトリで以下のコマンドを実行して下さい。
するとhoge.aviというファイル名の動画ができます。

$ ffmpeg -i %04d.png -vcodec mjpeg -sameq hoge.avi

▽オプション説明

 -i : 読み込むファイルを指定。%04d のオプションはファイル名前の桁数を表しています。
      つまり、%04d のオプションは 0000.png、 0001.png、0002.png... というファイル名のときに使用します。
      もし、ファイル名が 000.png、001.png...だったら %03d とすればokです。

 -vcodec : どの映像のコーデックを使うかを指定します。

 -sameq  : 画像と同じ画質で動画を作成します。

動画のフレームサイズを変えたい場合は-sオプションを使って、

$ ffmpeg -i %04d.png -vcodec mjpeg -sameq -s 100x100 hoge.avi

とするとサイズが100x100の動画が作成されます。

フレームレート(パラパラ動画の表示速度)を調整したい場合は-rオプションで変更できます。

$ ffmpeg -r 1 -i %04d.png -vcodec mjpeg -sameq hoge.avi

オプション -r は1秒間に何枚画像を表示するかを指定できます。上の例だと1秒間に1枚表示です。