ffmpegとは
FFmpegは動画と音声を変換することのできるUNIX系OS生まれのフリーソフトウェア。コマンドラインから使用することができる。
(ttp://ja.wikipedia.org/wiki/FFmpeg)
基本的な使い方
ffmpeg –i 入力ファイル名 出力ファイル名
入力ファイルが動画の時、出力ファイル名の拡張子を aac にすれば音楽ファイルに変換され、出力ファイル名を%03d.png とすれば連番の画像ファイルに書き出される。
【オプション】
-ss : 開示時間
-t: 切り取る時間
-encoders: エンコーダーの一覧を出力
ffmpeg –i 入力ファイル名とだけすれば入力ファイルの情報(ビデオや音声の種類)を出力する。
Windows版バイナリのダウンロード
公式ページ(ttps://www.ffmpeg.org/)のDownloadから「 Get the packages」のWindowsの画像にカーソルを置くとWindows Buildsのリンクが現れ、そこからバイナリを配布しているzeranoeのページ(ttp://ffmpeg.zeranoe.com/builds/)に飛べる。バイナリ配布の場所を見つけるのが難しい。
64ビット版をダウンロードするとして、Static版とShared版の2つがあり、どっちをダウンロードするか迷うかもしれない。Shared版はプログラムの共用部分を別のDLLファイルにしている。(gcc -sharedとすればDLLが作成される)。Static版のBinにはffmpeg.exe、ffplay.exe、ffprobe.exeの3つの実行ファイルがあるだけだが、Shared版は実行ファイルから呼び出されるDLLファイルが8つ個ほど含まれていた。Shared版の方がファイルサイズが小さいので、Shared版を使うのがいいと思う。
zeranoeのページで過去のバイナリをダウンロードできるが、ffmpegの安定版のバージョン2.6.3のバイナリは置かれていない。gitで開発中の最新のものだけが置かれている。安定版の2.6.3を使うには自前でビルドするしかない。
(追記:これを書いた2015年6月時点では最新のものしか置いてなかったが、2016年4月現時点では安定版もしくはバージョン付きのバイナリがzeranoeのページに置かれるようになっていた。
窓の杜ttp://www.forest.impress.co.jp/docs/news/20160217_744023.htmlによると、FFmpeg 3.0はネイティブAACエンコーダーの品質が十分に成熟し、安定版としてリリースされた。libvo-aacencとlibaacplusのサポートは打ち切られた。FFmpegのネイティブaacの音質が良ければ、FDK-AAC入のffmpegをビルドする必要がない。音風景ブログのこの記事ttp://d.hatena.ne.jp/kamedo2/20160215がおそらくネイティブaacとFDK-AACの比較で、FDK-AACの方が音質が良いとしているので、FDK-AAC入のffmpegをビルドする価値がまだあるかもしれない。)
配布されているWindows版バイナリ版の制約
zeranoeで配布されているWindows版バイナリ版で aac に変換してみれば分かるが、 aac に変換する際にエンコーダーとして libvo_aacenc が使われている。
2012-01-14 - 音風景ブログ(ttp://d.hatena.ne.jp/kamedo2/20120114)によると、vo-aacenc を「劣悪なエンコーダの代表」とし、FFmpegから使えるエンコーダの音質比較 - 音風景ブログ(ttp://d.hatena.ne.jp/kamedo2/20140228/1393609955)によると、FDK-AACをFFmpegで使える音声エンコーダの中で最も良いとしている。
ライセンス上の制約により自前でソースからビルドしないとffmpegで音質が良いと言われている FDK-AAC を使えない。
Michael の考え方
開発者の意見の不一致によりffmpegとlibavに分裂した経緯の記事に興味深いことが書いてあった。
- Michael Niedermayerはffmpegのトップの開発者。
- Michaelはバイナリパッケージ自体にも、あまり興味を示さなかった。まるで、「ユーザーは常に最新版を自前でコンパイルして使うべきである」、といわんばかりの姿勢だった。
- Michael Niedermayerは、何も自前ビルドの原理主義者ではない。ただ、バイナリパッケージというものが大抵、一年以上も前のバージョンから更新されなかったりすることに不服だという。すでに多くのバグフィクスや改良、新機能の追加が行われているというのに、バイナリパッケージはいまだに大昔のままである。さらに、ffmpegをめぐるソフトウェア特許の問題もある。ソフトウェア特許に対処するためには、ソースコードの形で提供して、ユーザーにコンパイルさせた方がいい。
(ttp://cpplover.blogspot.jp/2012/03/ffmpeglibav.html ffmpegとlibavの背景事情 2012-03-27)
ffmpegの公式サイトでWindows版バイナリを見つけにくく、配布版でfdk-aacが使えない事情がみえる。つまり、ffmpeg はユーザーがコンパイルして使ったほうが良い。私は自前でビルドしたのとzeranoe版の両方を使っている。
Windows7でffmpegのビルド方法
@MSYS2のインストール
ttps://msys2.github.io/ から MSYS2 をダウンロードする。OSが64ビット版なので、msys2-x86_64-20150512.exe をダウンロードした。このダウンロードのページは「GIMPのビルド方法」に書かれているものと同じなので安全だろう。
AMSYS2の設定
コマンドプロンプトから bash や ffmpeg を実行できるようにWindowsの環境変数PATHに <インストールした場所>\usr\local\bin と <インストールした場所>\mingw64\bin と <インストールした場所>\usr\bin の3つを追加する。mingw64\bin を usr\bin の前に追加しないと pkg-config 等が64ビット版の方を見にいかなくてハマる。
bash 実行時に $HOME/.bashrc を読み込んで欲しいので、Windowsの環境変数 HOME を作って適当なフォルダを入れておく。
【.bashrc に書いたら良さそうなもの】
export MAKEFLAGS=-j4 (← makeするときにCPUを4つ使って4倍高速になる。ビルド時にパッチを当てるlibaacplusのようにごく稀に-jを使うとビルドできない場合があった。) export MINGW_INSTALLS=mingw64 (← 後で出てくるが makepkg-mingw の実行に必要) export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig (← 後で出てくるが pkg-configの実行に必要) export PATH=/usr/local/bin:/mingw64/bin:/usr/bin:$PATH (← autopoint --dry-runがwindowsのfindを見に行って"FIND: パラメーターの書式が違います"と言うので)
B開発環境のセットアップ
pacman -S base-devel mingw-w64-x86_64-toolchain git mingw-w64-x86_64-gtk2 mingw-w64-x86_64-json-glib mingw-w64-x86_64-gtk-doc mingw-w64-x86_64-gexiv2 mingw-w64-x86_64-lcms2
を実行。これは上の「GIMPのビルド方法」に書かれている。(ffmpegのビルドに必要最低限なパッケージだけインストールしたいと思うかもしれないが、あきらめてパッケージを多めにインストールしよう。いろんなUNIX系のツールが使えるようになって嬉しい。)
gitと同類のコマンドのsubversion(svn)もpacmanでインストールしておくといいかもしれない。
Cpacman の使い方を学ぶ
- 全パッケージのアップグレード pacman -Syu
- パッケージのインストール pacman -S <パッケージ名>
- リポジトリデータベースを検索して、キーワードにひっかかるパッケージを表示 pacman -Ss <キーワード>
- そのパッケージによってインストールされたファイルを一覧表示す pacman -Ql <パッケージ名>
- そのファイルをインストールしたパッケージを確認 pacman -Qo <ファイル名>
(ttp://dev.classmethod.jp/cloud/aws/package-managemenrt-use-pacman/ はじめてのpacmanパッケージ管理ガイド 2014年10月14日)
他に
- インストール可能なパッケージのリストを出す pacman -Sl
- インストールされたパッケージのリストを出す pacman -Q
使いそうなのはこんなところ。
全パッケージを最新版にしたいので
pacman -Syu
を実行。
C少し遠回りしてAlexpuxのパッケージ一覧からffmpegのビルドに必要な依存パッケージをインストール
「Contributing to MSYS2」 にパッケージの作成方法が書いてある。
適当なフォルダ(${HOME}/msys)に移動して
git clone "https://github.com/Alexpux/MINGW-packages"
を実行。MINGW-packages以下にファイルが展開される。
cd MINGW-packages/mingw-w64-ffmpeg
でffmpegのところに移動。PKGBUILD というファイルが1つだけあって中を見ると、depends で指定されている依存パッケージをインストールしたらいいことが分かる。makepkg-mingwはPKGBUILDを読み込む。
export MINGW_INSTALLS=mingw64
をmakepkg-mingwを実行するために実行。毎回実行するのが面倒なので .bashrc に書いておいたらいい。
makepkg-mingw -soL
を実行。 (オプションの意味は -s: 足りない依存パッケージをpacmanでインストール、 -o: ダウンロードして展開するだけ、 -L: ログを取る )。これでffmpegのソースの展開まで完了。ログのサイズが0だったので-Lの意味がなかった。
ここではダウンロードして展開するだけにしたが、makepkg-mingwはここからconfigureしてビルドして圧縮してインストールパッケージを作成する。
Dfdk-aac をビルド
fdk-aac のパッケージを pacman でインストールできないのでソースからビルドしなければならない。
ffmpeg の依存パッケージのソースがどこにあるかは、「ffmpegをスタティックビルドする(CentOS6) (ttp://qiita.com/takakiku/items/4f129a8859d99f6be2db)」を見ればいい。そこに載ってないパッケージもある。
cd $HOME/msys/src git clone https://github.com/mstorsjo/fdk-aac.git cd $HOME/msys/src/fdk-aac autoreconf -fiv ./configure export MAKEFLAGS=-j4 (← makeを4倍速くするためのオプション) make make install
を実行。gitで取ってきたfdk-aacのバージョンはv0.1.4。
configure の --prefix オプションを省略したので /usr/local/ にインストールされる。--disable-shared オプションを削除したのはDLLを利用していこう、ffmpegを自前でビルドして使うときはMSYS2も一緒にインストールしようとするこの記事の方針のため。他のブログの記事はMSYS2がなくても動くようにstaticやsharedを工夫しているのがほとんど。この記事はpacmanでインストールできるところはバイナリインストールしているので手間がかからない。Windows MINGW MSYS2環境でのソースのビルドは恐ろしく遅い。
pkg-config --cflags --libs fdk-aac
が結果を返さないので
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
を実行して結果を返すようにする。
Effmpegのビルド
makepkg-mingwがダウンロードしたffmpegのバージョンは2.6.3。
cd $HOME/msys/MINGW-packages/mingw-w64-ffmpeg/src/ffmpeg-2.6.3
でソースが展開されているフォルダに移動。
pacman -S mingw-w64-x86_64-faac mingw-w64-x86_64-twolame mingw-w64-x86_64-libgme
でビルドに必要な依存パッケージを追加。
./configure --disable-debug --disable-doc --disable-ffplay --disable-ffserver --disable-static --disable-w32threads --enable-avisynth --enable-avresample --enable-bzlib --enable-fontconfig --enable-gnutls --enable-gpl --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libcelt --enable-libfaac --enable-libfdk-aac --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-nonfree --enable-openal --enable-pic --enable-postproc --enable-runtime-cpudetect --enable-shared --enable-swresample --enable-version3 --enable-zlib --target-os=mingw32 --extra-cflags="-I/usr/local/include" --extra-libs="-L/usr/local/lib" --enable-libgme
make make install
を実行。Windows MINGW MSYS2環境でのconfigureが恐ろしく時間がかかる。
fdk-aacを使って変換するには-c(codec):a(audio)を指定する必要がある。指定しないとlibfaacが使われた。
ffmpeg -i xxx -c:a libfdk_aac test.aac
Fffmpegのビルド (後日談)
Alexpuxのvlc-gitをビルドしたら依存パッケージになっててffmpegを/mingw64にインストールしやがった。pacman が自前でビルドしたffmpegを認識するように makepkg-mingw の続きをした。ファイルPKGBUILDのconfigure行を書き換え(--prefix=${MINGW_PREFIX} --arch=${CARCH%%-*} は残しておく)、エラーになるmake check行をスキップしたいので、 makepkg-mingw --nocheck を実行してインストールパッケージの mingw-w64-x86_64-ffmpeg-2.6.3-1-any.pkg.tar.xz を作成。pacman -U mingw-w64-x86_64-ffmpeg-2.6.3-1-any.pkg.tar.xz でこのインストールパッケージを/mingw64にインストールし、/usr/local 以下にインストールしていたffmpeg関連ファイルを全削除した。ldd /mingw64/bin/ffmpegとやれば分かるが、 ffmpeg が /usr/local/bin/msys-fdk-aac-1.dllを参照しているので、 fdk-aac のファイルを残しておく必要がある。
Gffmpegのビルド (後日談2)
「【ffmpeg】 fdk-aac と aacplus を同梱する(ttp://looooooooop.blog35.fc2.com/blog-entry-971.html)」に両方sharedでビルドできるとあったのでやってみた。以前--disable-sharedで試したときはこれらが同じ関数名を使ってたのでビルドできなかった。ttp://tipok.org.ua/node/17 からlibaacplus-2.0.2.tar.gz を取得。libaacplus はmakeのときにMAKEFLAGS=-j4をするとエラーになるので解除が必要。pacman -S mingw-w64-x86_64-fftwして./configure --with-fftw3-prefix=/mingw64してmake -j1してmake installでaacplusをビルド。
なぜaacplusを入れてみたかというと、aacplusでHE-AACv2にエンコードすると低圧縮のaacに比べてファイルサイズが1/3〜1/4に減るにもかかわらず、音質の違いがほとんど分からない。aacplusの基本は48kbpsだが24kbpsでエンコードするとさらにファイルサイズが半分になり、これも音質の違いがほとんど分からない。なおneroAacEnc.exe -hev2 -q 0.15 -if in.wav -of out.aacやffmpeg -i in.xxx -c:a libfdk_aac -profile:a aac_he_v2 -ar 24k out.aacでも同じようにファイルサイズを小さくできる。サイズを最大限小さくしたとき(24kbps, 48kpbs)の音質比較を誰かしないかな。
次に$HOME/msys/MINGW-packages/mingw-w64-ffmpegに移動して--enable-libaacplusをPKGBUILDのconfigureに追加してmakepkg-mingw --nocheckを実行してffmpegをビルド。ffmpeg.exe -i in.mp4 -c:a libaacplus -b:a 48000 -t 10 out.aac で動作確認。
Gffmpegのビルド (後日談3)
6/10 FFmpeg 2.7が公開された。筆者が見たのは翌日だがAlexpux氏が早くもMINGW-packagesを更新していた。makepkg-mingw --nocheckでERROR: libx265 version must be >= 57.というエラーが出るので、まずはpacman -Syuでパッケージを更新しておく。次にgit fetchからgit mergeとやるとPKGBUILDを筆者が修正していたためにエラーで更新できず。PKGBUILDのバックアップを取ってからgit checkout PKGBUILDで上書きしてからgit mergeで取り込めた。その後、バックアップを元にPKGBUILDを修正してからmakepkg-mingw --nocheck。何故か以前の2.6.3の方を見に行ってるログが出たので2.6.3や.oを置いてあるフォルダは別名にするか消しておくのがいいかも。
frei0r の使い方
【準備】
- ttp://ffmpeg.zeranoe.com/builds/win64/external_libs/frei0r-20130321-git-245bb38-filters-win64.7z をダウンロードする。zeranoe 32ビット版を使う場合は、win32の方をダウンロードする。
- 解凍し、どこでもいいが、<msysのインストール場所>\usr\local\lib\frei0rに置く。
- export FREI0R_PATH='<msysのインストール場所>\msys64\usr\local\lib\frei0r' もしくは export FREI0R_PATH='/usr/local/lib/frei0r' を実行。
【実行】
上のビルドは--enable-frei0rを付けていないので、zeranoe版のffmpegで実行する。
<zeranoe版のffmpeg.exe> -i 入力ファイル -t 10 -loglevel debug -vf "frei0r=glow:20" 出力ファイル
とすると、映像にglowフィルターがかかって明るくなった。
<zeranoe版のffmpeg.exe> -i 入力ファイル -t 10 -vf "frei0r=perspective:0.2/0.2|0.8/0.2" 出力ファイル
とすると、映像にperspectiveフィルターがかかって台形に変形した。
<zeranoe版のffmpeg.exe> -i 入力ファイル -t 10 -vf "frei0r=IIRblur:0.4" 出力ファイル
とすると、GIMPでいうところのガウシアンぼかし(IIR)がかかった。
<ffmpeg> -i 入力 -vf "frei0r=3dflippo:0|0|0|0.01|0|0.005|0.45|0.45|n|n|y" 出力ファイル
とすると、奇妙に回転した。
<zeranoe版のffmpeg.exe> -i 入力ファイル -vf "frei0r=lenscorrection:0.4|0.5|0.1|0.2|0.3" 出力ファイル
とすると、意味不明なレンズ効果がかかった。
mp4に出力するとh264 (High 4:4:4 Predictive)という特殊なプロファイルになって、VLCで再生できるが、Windows Media Playerでは再生できなかった。
【仕様】
まとまった文書がないらしく、frei0rのページ(ttp://frei0r.dyne.org/)からダウンロードしたソースを見るしかないようだ。DLLに対応したソースの関数f0r_get_param_infoに引数の説明が書かれている。|が引数の区切りで、x/yで(x, y)座標のようになり、yかnで真偽を表す。
【ビルド】
ttps://ffmpeg.zeranoe.com/forum/viewtopic.php?f=5&t=312&p=2716 によると、 frei0r.hをincludeフォルダーに置くだけで --enable-frei0r が通ったらしい。
【感想】
frei0rの使用用途が思いつかない。
【VLC】
なおVLC media player でも動画にフィルター(画像効果)をかけることができる。
やり方は、実験的な機能のためか隠されていて、ツール>設定>設定の表示(すべて)>ビデオ>フィルターにある、フィルターの1つにチェックを付け、再起動して動画を再生。例えば、ミラービデオフィルターを使えば、動画が鏡像になって再生される。他にも分かりやすい効果があるのは、ビデオ回転フィルター、波状ビデオフィルター、拡大ズームインタラクティブビデオフィルターあたり。VLCの動画フィルターも使用用途が思いつかない。ミラービデオフィルターで目が1つの顔になるのがうけるくらい。
(追記:エフェクトやフィルターを使うのであればfrei0rやVLCよりもAVIUtlの方が良い)