ffmpegをサーバーにインストールして動画を変換してみますた

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
動画の自動変換をサーバーでやらなきゃいけない必要に駆られまして……とは言うものの、僕は動画周りの技術は全然ないわけでして、どうにかこうにか調べた結果、ffmpegってやつを使ってみるのが良いんじゃないかと。

いろいろ調べてみたんですが、古い文献から新しい文献までさまざまなおかげで、情報が錯綜しまくりんぐなんですな。たぶん、バージョンアップが繰り返されて行く中で細かく変わっていったからだと思う。

しかも、多くの文献では、単純にffmpegをインストールしただけじゃダメだよ〜、いろんなファイル形式に対応するためにはインストールしなきゃいけないものがごまんとあるんだよ〜って書いてありました。それだけでもう、若干心が折れた。

でもそんな中、一回やむるだけでオッケー牧場って言ってる記事もいくつかあったので、今回はそれを参考にしました。やっぱり人生、なるべく楽したいもんね。

じゃあ、そのやり方をば。ちなみにサーバーはCentOS6です。



……ああ、そうだ。

やむるってのはあれね。うちのサイトではよく出て来るんだけど、コマンドの「yum」を実行するっていう意味ね。



リポジトリ、討ち取ったり

一回やむればオッケーとは言っても、普通にやむってもffmpegはインストールできない。

そこでリポジトリの追加が必要になるわけです。

リポジトリっていうのは、あれだよ。ほら、あれ……借金取りの仲間だよ。何か必要なものを取って行くんだよ。

まあそれは嘘ですが、とにかく追加してみましょう。そのリポジトリとやらを。

# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
# rpm -Uvh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

これでオッケーです。これでRPMリポジトリというのが追加されました。

これはOSのバージョンとかによってインストールするべきファイルが違うらしいんで、気をつけてくだせえ。CentOS6で64bitの場合は上のファイルで良いっぽい。

他の場合は、ここから探すことができると思う。僕も今回ここから探して来ました。



追加が終わったら、やむるときにデフォルトでこのRPMforgeってやつが使用されないように設定しておく必要があるみたいです。

やむるときっていう説明で良いのか分からないけど、とにかくそんな感じ。

「/etc/yum.repos.d/」っていうディレクトリの下に「rpmforge.repo」というファイルができているはずだから、それをviモードで編集する。

# vi /etc/yum.repos.d/rpmforge.repo

enable=1
→enable=0

ファイルを開いてみると、「enable=1」っていう行が一つか二つか見つかると思うんで、それを全部0にすればオッケー。



さあ、いざffmpegを我が手に

と言っても、一発やむれば良いので、お手軽簡単。平野レミさんの140文字レシピ並みにお手軽簡単♪

# yum --enablerepo=rpmforge install ffmpeg

終わりまんた。

別の方法で入れる場合、AACにエンコードできるようにとか、H264にエンコードできるようにとか、mp3に対応するためとか、あとは何か聞いたこともないようなものをエンコードやらデコードやらできるようにするためにあれもこれも自分で入れないといけないぜーっていう感じらしいんですが、この方法だとその辺りの必要なものを一緒に入れてくれるみたいなんで、楽勝っす。楽勝すぎて鼻血が出るレベル。



試しに変換シテミル?

じゃあ、せっかく入れたんで、早速変換してみましょう。

僕が今回このffmpegを使用しようとしているウェブサービスでは、基本H264っていうやつを推奨してるので、今回は、FLVの動画をH264に変換してみます。

# ffmpeg -i sample.flv -vcodec libx264 sample.mp4

「sample.flv」が変換元のファイル。「sample.mp4」が変換後のファイルです。「-vcodec」っていうのはffmpegコマンドのオプションの一つで、これで変換する動画の形式を決めるみたいです。H264にしたい場合は「libx264」というやつを指定するらしい。

しかし、動画の変換って自分で実装しようと思ったら相当大変なんだろうなぁと思っていたのに、ぶっちゃけここの開発だけで半月以上もスケジュール開けてあるのに、たったこれだけでflvファイルがh264に……

ならない!?



しかしオプションが足りない

そう、やってみたら変換できなかったんすよ。何かこんなエラーが出た。

while opening encoder for output stream #0.0 – maybe incorrect parameters such as bit_rate, rate, width or height

ビットレートがどうとか、縦や横のサイズが上手く取れない的なエラーなのかなぁと最初は思ったんですが、どうもそういう感じではないみたいで、何かlibx264っていうやつが、動画を変換する際にffmpegのデフォルト値を判定しているらしいんですが、それが一定の条件を満たすとエラーになるらしいんですね。

簡単に言うと、コマンドを実行する際のオプションの指定が足りてないよってことですね。イオナズンを唱えようとしてMPが足りなかったベビーサタンと完っ全に一緒ですね。

あかつきは動画を変換しようとした。しかしオプションが足りない!



こちらのサイトさんに、今回のエラーに関する説明があるので、参考までに。9個のデフォルト値が判定の対象となるって話なんですが、ぶっちゃけそれぞれのデフォルト値が何を意味しているのか全く分からないんで、ここでは省略します。

まあ、ようするにこのエラーを解決したきゃ、コマンドを実行するときにオプションで値を指定すりゃあモーマンタイってことですよ。

だから例えば……

# ffmpeg -i sample.flv -vcodec libx264 -qmin 10 -qmax 51 -qdiff 4 -i_qfactor 0.7 -qcomp 0.6 -g 250 sample.mp4

こんな感じで、判定の対象となるオプションをつければ、エラーは出なくなる。

でも、毎回こんなの書くのめんどいよね〜。それに、それぞれのオプションの値を何をどうすれば良い感じの設定になるのかってのも、よく分かんないしね。



プリセットをセットしてターンエンド

ffmpegをインストールしたことで、「/usr/share/」っていうディレクトリの下にffmpegのディレクトリができてると思うんですが、その中を見てみると、拡張子が「ffpreset」っていうファイルがいくつか入ってます。

このプリセットファイルは、さっき上で書いた「qmin」だの「qmax」だの「qdiff」だのっていう、本来自分で書かなきゃいけないいくつかのオプションの入力を補助してくれるようなファイルみたいです。

実際にファイルの中を見てみましょうか。

# less /usr/share/ffmpeg/libx264-default.ffpreset

//libx264-default.ffpresetの中身
coder=1
flags=+loop
cmp=+chroma
partitions=+parti8x8+parti4x4+partp8x8+partb8x8
me_method=hex
subq=7
me_range=16
g=250
keyint_min=25
sc_threshold=40
i_qfactor=0.71
b_strategy=1
qcomp=0.6
qmin=10
qmax=51
qdiff=4
bf=3
refs=3
directpred=1
trellis=1
flags2=+mixed_refs+wpred+dct8x8+fastpskip
wpredp=2

さっき出て来た「qmin」やら「qmax」っていうのが、書いてありますね。他にもよく分かんないのがいっぱい書いてありますが、とにかく、ffmpegコマンドを実行する際に、このファイルを読み込むことによって、オプションを設定できると、そういうわけです。

じゃあどうやって読み込むかって話なんですが、それもまた、コマンド実行の際のオプションで行けます。

「-vpre」というオプションが、それに該当します。

# ffmpeg -i sample.flv -vcodec libx264 -vpre default sample.mp4

こうですね。

何でそう書くのかはやっぱりよく分かんないんですけど、ffpresetファイルは、全部「libx264-〇〇〇〇.ffpreset」っていうファイル名になってるので、この「〇〇〇〇」の部分を-vpreオプションで指定すれば良いみたい。

libx264-max.ffpresetだったら「-vpre max」だしlibx264-hq.ffpresetだったら「-vpre hq」だし。

ちなみに、僕はこの「hq」ってやつを使うことにしてます。このhqって、「High Quality」の略だと思うんだよね。だから何か良さそうじゃん?

時間があれば、これらのファイルを一通り調べてみて、ついでの各オプションの意味も調べて、どうなのかっていう話もしたいとこなんですが……あまりに分からなすぎて心が折れたから今回はごめんちゃい。各々ググるよろし。

何にせよ、これで何とかflv動画がh264の動画に変換できました。めでたしめでたし。






いざやってみると、そこまで難しいってこともないのかなーって感じです。

や、ちゃんと使いこなして高度な設定を行なおうと思ったら難しいと思うんだけど、とりあえず変換するとこまで行くだけなら、何とかなる。

あとはあれですね。PHP側で重たい動画をアップロードしたとき、それをページの表示とは切り離して……裏側(バックグラウンドって言うの?)で変換処理できるようにしたいんだけど、それはまた次ですね。

ってなことで、本日はこれにて解散!!
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください