adbird(広告鳥) 備忘録

複数画像からスライドショー動画(BGM付き)を作成

追記:新しい記事(OpenShot 動画エディターで画像スライドショー動画(BGM付き)を作成)で紹介した方法の方がもっと簡単にできる。



スライドショーにしたい画像が全て同じサイズであれば、最後の 連番画像からスライドショー動画を作成 を読んでも構わない。

しかし、縦向き・横向きの画像をごちゃまぜにして後述の ffmpeg を実行すると、縦長の画像が横に引き伸ばされたりするなどして、画像が歪んでしまう。
これはどうやら、ffmpegが最初の画像の縦横のサイズを読み込み、後続の画像を最初の画像のサイズに合わせるからっぽい。

なので、ffmpeg実行の前に、全ての画像を、スライドショーの最初の画像のサイズに合わせる必要がある。

任意のフォルダに画像を入れる

スライドショーにしたい画像(縦横ごちゃまぜのままでいい)を任意のフォルダ内にコピーする。

画像ファイルを連番でリネーム

画像ファイルを、001.jpg 002.jpg,…というように、0から始まる3ケタの数字の連番にリネームする。
連番にしておかないと、下記方法で作成するスライドショー動画が途中で止まってしまうので注意。

Ubuntuなら、ファイルマネージャー「ファイル」(旧 Nautilus)で画像を全て選択して右クリックして、「名前の変更」から連番にする。

f:id:adbird:20200707174253p:plain

拡張子を「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)にリサイズ

することである。

f:id:adbird:20191204232444j:plain

高さを揃える

※ 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 に揃えられた。 f:id:adbird:20191204232612j:plain

連番画像からスライドショー動画を作成

スライドショー動画に変換する。最終的に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 にアップロードしたのが こちら

スライドショーの最初の画像にタイトル文字を入れたいときは、画像に文字を入れる を参照のこと。

参照リンク