planet-green.com

[備忘録] FFmpegで複数の静止画からタイムラプス(微速度撮影)動画を作る



by いらすとや

ここ最近、試験的にタイムラプス動画をいくつか作ってますが、全てJPEGやTIFF等の静止画からFFmpegを使って動画に変換しています。

(作例については、例えばこの記事やこの記事とか)

FFmpegは動画と音声を記録・変換・再生するためのソフトウェアで、誰でも無料で使えます。

一般の人が普段よく目にするソフトウェアと違って、UI(操作画面)の無い、コマンドプロンプト(Macの場合はターミナル)から実行するソフトウェアなので、慣れるまでが少し大変かもしれません。

しかし、一度インストールしてしまえば、後は基本的に毎回同じコマンド文をコピー&ペーストして実行するだけなので何も考えずに使えます。

インストール方法はGoogle先生に聞くと詳しく教えてくれると思います。

Windowsへのインストール方法

Macへのインストール方法

 

私の場合だと、cdコマンドで画像の置いてあるフォルダに移動してから、次のオプションを付けて実行しています。

 

各オプションの説明

-pattern_type この例では glob -i ‘*.jpg’ と指定することで、.jpgの拡張子が付いた画像ファイルをファイル名順に読み込みます。
-s リサイズ。この例だと1920 x 1280 にリサイズするということ。
リサイズの必要が無ければ指定しなくてもいいです。
縦・横ともに2の倍数でないとエラーになるので注意。
-b 動画のビットレート。この例だと24000k=約24MB/秒。
この数字が大きいほど画質が良くなりますがファイルサイズも大きくなります。
どのくらいのビットレートがいいかについては、YouTubeの説明が参考になると思います。

基本的には、FFmpegで書き出した動画を後で動画編集ソフトで読み込んで各種編集や音を入れたりする作業をすることになると思うので、ここでは出来るだけ高画質にしておくのがいいと思います。

-framerate フレームレート(1秒あたりのコマ数)。
例えば、元画像が150枚あったとしたら、フレームレート30で5秒の動画になります。
-r ↑と同じ。-framerateは入力時、-rは出力時のフレームレートを指定するものなので両方指定するのがいいらしいです。
-an 音声無しにする。
-vcodec コーデックの種類。よくわからなければ、この例のように libx264 (H.264)を指定するのが無難です。
-pix_fmt 色深度を指定。これもよくわからなければ yuv420p が無難です。

 
また、Mac限定ですが、画像を16bitのTIFFで書き出して下記オプションで変換すれば10bit色深度のProRes HQフォーマットで動画を作成できます。
ハードディスクを爆食いするのが難点ですが・・・。

コメント
planet-green.com

MacPro2010にGeForce GTX 960を取り付ける



MacPro(2010年モデル)にGeForce GTX 960を取り付けました。
CUDAドライバーも認識されています。
取り付け手順や注意点は基本的に前回の記事と一緒です。

GeForce GTX 960をMacProに搭載
ちなみにELSAのGeForce GTX 960 2GB S.A.C SS GD960-2GERXSです。

GeForce GTX 960をMacProで認識

MacでCUDAドライバー

Final Cut Pro Xで4K動画の編集をする必要があったのですが、MacPro標準のグラフィックボード(ATI Radeon HD 5770)では重すぎてスムーズに編集できなかったのが、GTX960では何とか実用的なレベルになりました。
(とはいえ、ビデオエフェクトなどを多用すると重くなりますが。)

また、ffmpegをOpenCVを有効にしてインストールすると、エンコードの際にCUDAを利用するようで、CPU負荷が低くなってるのが確認できました。

OSのアップデートの度にビデオドライバーを入れ直さないといけないのは相変わらずで、画面が真っ黒になるので別のMacからリモート接続(『画面を共有』のこと)してインストールしてます。

コメント
planet-green.com

ffmpegのインストール及びavconvとの比較 (追記あり)



私が開発してるサービスで動画のエンコードが必要になった時の作業メモです。
ちなみにサーバー環境は Linux 64Bit(Ubuntu 12.04.3 LTS)、さくらサーバーのVPS。
(※Ubuntu16での変更点は追記に記載してます。)

ubuntuにパッケージで用意されているのはffmpegから派生したavconvだったので、当初はパッケージ版のavconv(v0.8.9)をインストールして動画をコンコードするプログラムを書いていました。
といいますか、ubuntuで apt-get install ffmpeg を実行するとffmpegではなくavconvがインストールされます。

ところが、いくつかのタイプの動画をテストでエンコードしてみてわかりましたが、このパッケージ版には不具合があります。
QuickTimeでエンコードされたmovファイル(動画コーディックはmp4)を再エンコードしようとすると Floating point exception というエラーが出て止まってしまいます。

既にプログラムはavconv用に書いていたので、気を取り直してソースから最新版のavconv(v0.9.10)をビルドしてみました。
すると、先ほどのmovファイルの再エンコードではエラーは出なくなりましたが、今度は別のwmvファイルを再エンコードしようとすると、

Application provided invalid, non monotonically increasing dts to muxer in stream 1: 13568 >= 13024
av_interleaved_write_frame(): Invalid argument

というエラーが出て止まります。

v0.8.9のソースからビルドすると、上記2つの動画は正常にエンコード出来るようになりましたが、古いバージョンを使うというのは気持ち的にあまり嬉しくありません。
そこでavconvは諦め、本家ffmpegに回帰することにしました。

ソースから ffmpeg v8.90 + libx264 + libvpx + FDK-AAC をビルドして、上記の二つの動画も問題なくエンコードできる事を確認。
オプションの挙動がavconvと若干異なっているのでプログラム側を微調整。

avconvは -movflags faststart に対応してないようでqt-faststartを後から実行する必要がありましたが、ffmpegではオプション一発で済むので楽ちんです。
また、動画フィルターとサイズ指定オプションの実行される順番なども異なってるようです。

以下、ffmpegをインストールした時の作業メモ。

【yasm】
ubuntuのyasmが1.1系でx264のビルドには1.2系が必要なので、先にインストール。
http://yasm.tortall.net/Download.html

./configure
make
make install

【FDK-AAC】
http://sourceforge.net/projects/opencore-amr/files/fdk-aac/

tar xzvf fdk-aac-0.1.*.tar.gz
cd fdk-aac-0.1.*
./configure --prefix=/usr/local
make
make install-strip

もし、 ./libtool: line 1125: g++: command not found の等エラーが出たら
apt-get install g++ でg++をインストール。

【libx264】
http://www.videolan.org/developers/x264.html

git clone git://git.videolan.org/x264
cd x264
./configure --prefix=/usr/local --enable-shared --enable-pic --extra-cflags=-fPIC --extra-ldflags=-fPIC --extra-rcflags=-fPIC --enable-strip
make
make install

【libvpx(WebM VP8/VP9 Codec SDK)】

git clone --depth 1 http://git.chromium.org/webm/libvpx.git (※下に追記あり)
cd libvpx
./configure --prefix=/usr/local --disable-examples
make
make install
ldconfig

【ffmpeg】

git clone git://source.ffmpeg.org/ffmpeg.git
cd ffmpeg

./configure \
--prefix=/usr/local \
--libdir=/usr/local \
--shlibdir=/usr/local \
--incdir=/usr/local \
--mandir=/usr/local \
--arch=x86_64 \
--disable-debug \
--extra-cflags="-s -O3 -mtune=native -march=native" \
--enable-gpl \
--enable-nonfree \
--enable-libfdk-aac \
--enable-libvpx \
--enable-libx264
make
make install
ldconfig
  • 結局のことろ、本家公式サイトが一番参考になりました。
    https://trac.ffmpeg.org/wiki/UbuntuCompilationGuide
  • AACエンコーダーはNeroAACCodecが最も音質がいいらしいですが、ffmpegへは組み込めず外部プログラムを呼び出す形になるため、次点のFDK-AACでいいかなと。

#追記 2016/10/13

Ubuntu 16.04 LTS にインストールしてみました。
基本的には上記のままで大丈夫でした。
yasm は1.3系がパッケージに含まれているのでapt-getでいけます。

apt-get install yasm

libvpxのレポジトリが移転してました。

git clone https://chromium.googlesource.com/webm/libvpx

FDK-AACの高音質が欲しくてソースからビルドしてみましたが、そこまでこだわりが無ければ、Ubuntu16の標準パッケージで全然問題ないかも・・・。

コメント