追記:新しい記事(OpenShot 動画エディターで画像スライドショー動画(BGM付き)を作成)で紹介した方法の方がもっと簡単にできる。
スライドショーにしたい画像が全て同じサイズであれば、最後の 連番画像からスライドショー動画を作成 を読んでも構わない。
しかし、縦向き・横向きの画像をごちゃまぜにして後述の ffmpeg を実行すると、縦長の画像が横に引き伸ばされたりするなどして、画像が歪んでしまう。
これはどうやら、ffmpegが最初の画像の縦横のサイズを読み込み、後続の画像を最初の画像のサイズに合わせるからっぽい。
なので、ffmpeg実行の前に、全ての画像を、スライドショーの最初の画像のサイズに合わせる必要がある。
任意のフォルダに画像を入れる
スライドショーにしたい画像(縦横ごちゃまぜのままでいい)を任意のフォルダ内にコピーする。
画像ファイルを連番でリネーム
画像ファイルを、001.jpg 002.jpg,…というように、0から始まる3ケタの数字の連番にリネームする。
連番にしておかないと、下記方法で作成するスライドショー動画が途中で止まってしまうので注意。
Ubuntuなら、ファイルマネージャー「ファイル」(旧 Nautilus)で画像を全て選択して右クリックして、「名前の変更」から連番にする。
拡張子を「jpg」に統一
もし拡張子が「JPG」や「jpg」とバラバラだったら、拡張子を統一しておく。以下は jpeg の拡張子を jpg に一括置換する方法。
$ rename 's/.jpeg/.jpg/' *.jpeg
画像のサイズを揃える
以下、ここでの前提。
- スライドショーにしたい画像には、以下の画像が混在している状態。
- 横長(幅1600 x 高さ1200。 単位ピクセル、以下同じ)
- 縦長(幅1200 x 高さ1600)の画像
- スライドショーは横長(1600 x 1200)の画像から開始する。
つまり、やるべきは
- 縦長の画像(1200 x 1600)を、横長の画像サイズ(1600 x 1200)にリサイズ
することである。
高さを揃える
※ mogrify コマンドは画像を上書き保存するので気をつけること。元の画像は必ず別のフォルダでバックアップを取っておくこと。
全ての画像の高さを、横長画像の高さの1200ピクセルに揃えて、リサイズする。
$ mogrify -resize x1200 *.jpg
-resize x1200
: -resize [幅]x[高さ]
幅を指定しないことで縦横のサイズ比を維持したまま、高さに合わせてリサイズしてくれる。
これで幅1200 x 高さ1600の縦長画像が、幅900 x 高さ1200 の縦長画像になる。
このままスライドショーを作ってもやはり画像が歪むため、幅も揃えないとダメ。
幅(キャンバス)を揃える
上記でリサイズした縦長の画像(900 x 1200)の大きさは変えないまま、キャンバスだけを幅1600に広げる。
$ mogrify -extent 1600x1200 -gravity center -background black *.jpg
-extent 1600x1200
: キャンバスを1600x1200に。
-gravity center
: 画像を中央に配置。
-background black
: キャンバスの色を黒に。
これで画像サイズが全て 1600 x 1200 に揃えられた。
連番画像からスライドショー動画を作成
スライドショー動画に変換する。最終的にBGMのついたスライドショー動画を作成するには、以下の①から③の順に作っていく。
①BGMなしのスライドショー動画
まずはBGMなしのスライドショー動画をつくって、動画の時間を調べる。
$ ffmpeg -f image2 -r 0.3 -i %03d.jpg -vcodec libx264 -pix_fmt yuv420p video.mp4
-f image2
: jpeg 画像であることを明示。多分、なくてもOK。
-r 0.3
: 1秒間に何枚の画像を表示するか。数値が小さいほど、スライドショーはゆっくりになる。
-i %03d.jpg
: 0から始まる3ケタの数字で表現されるファイル名(001.jpg,…)
-vcodec libx264
: H.264 でエンコード
-pix_fmt yuv420p
: これがないとtwitterにアップロードできない
②スライドショーにつける音声データを準備
スライドショー動画の時間が分かったら、著作権フリーな音楽やBGMを フリーBGMサイト DOVA-SYNDROME などから落としてきて、短くカットしたり、フェードアウトさせたりして、スライドショー動画の長さに合わせた音声データにする。
以下は長い音楽を2分間の長さにして、最後に3秒間のフェードアウトを加える方法。
$ ffmpeg -ss 0 -i music_input.mp3 -af "afade=t=out:st=117:d=3" -t 00:02:00 music.mp3
-ss 0
:切り取り開始時間。
-af "afade=t=out:st=117:d=3"
:フェードアウトを開始する時間とフェードアウト時間。ここでは冒頭から117秒後に3秒間フェードアウト。
-t 00:02:00
:2分間で、切り取り終了時間。
③BGMありのスライドショー動画
上記で編集した音楽データを使って、あらためてスライドショー動画を作成する。
$ ffmpeg -f image2 -r 0.3 -i %03d.jpg -i music.mp3 -vcodec libx264 -pix_fmt yuv420p video.mp4
-f image2
: jpeg 画像であることを明示。多分、なくてもOK。
-r 0.3
: 1秒間に何枚の画像を表示するか。数値が小さいほど、スライドショーはゆっくりになる。
-i %03d.jpg
: 0から始まる3ケタの数字で表現されるファイル名(001.jpg,…)
-i music.mp3
: BGM・音楽データ。
-vcodec libx264
: H.264 でエンコード
-pix_fmt yuv420p
: これがないとtwitterにアップロードできない
この方法で作った動画を twitter にアップロードしたのが こちら。
スライドショーの最初の画像にタイトル文字を入れたいときは、画像に文字を入れる を参照のこと。