ffmpegとは?
簡単に言うと、動画ファイル/音声ファイルを別の形式に変換してくれるソフトウェア。ソフトウェアと言ってもメールソフトのようなアプリケーションではなくて、
変換を行うプログラム、と言った方が正しいか。
ffmpegをローカルで使用すれば、携帯動画変換君みたいなプログラムになるし、
サーバ上で使えば自動的に変換処理してくれるサービスなんかも書ける。
そんな便利なもの。
1ヶ月ちょっと前にffmpegを使って、ちょっとした処理をサーバで行うプログラムを書いたので、
その辺のまとめ。
FFmpeg
まずは、インストール。
携帯動画変換君のようなローカルで使うアプリケーションの場合、パッケージの中にffmpegを同梱している場合が多いと思うけれども、
今回はサーバで使うのでおもむろにサーバにインストール。
コーデックの種類が多くて関連して入れたいライブラリも多いので、
詳しいサイトを参考に1つ1つ確認しながらやった方がよさげです。
まぁライブラリくらいなら後でも何とかなりますけどね。
(再コンパイルは必要だけど)
参考サイト
インストールに関しては、上記サイト(参考リンク1)を参考にすることで、
ほぼすんなり行けるんではないかと思います。
僕の場合、さらにmp3のエンコードにlameを使用したかったので、
mp3lameライブラリもインストール(参考リンク2参照)。
コンパイルはこんな感じ。
./configure –cc=gcc32 –enable-gpl –enable-mp3lame –enable-libfaac –enable-libfaad –enable-libamr_wb –enable-libamr_nb –enable-shared
以上で準備は完了。
コマンドで処理してみる。
アプリケーションに組み込むことになったとしても処理はコマンドなので、この書き方はどうかと思うけどとりあえずTelnetなどで動かしてみる。
例えばこんな感じ。
ffmpeg -y -i file_a -acodec libmp3lame -ac 2 -ar 44100 -ab 128 file_b
この意味は、
file_aを『ステレオ』『サンプリングレート44.1khz』『ビットレート128bit』でmp3に変換し、file_bという名前で保存する。
もし同名のファイルが存在していたら上書きする。
ということ。
詳しい仕様に関しては、ffmpegのドキュメントを読んでもらうとして、
FFmpeg Documentation
最低限な所だけ把握していればOK。
処理に掛かる時間は環境とモノにも依るけど、
5分ぐらいの音声ファイルで数十秒って感じ。あんまり負担は感じません。
PHPで動作させてみる。
やることは本質的に上と同じ。書いたプログラムから抜粋すると、
$command = '/usr/local/bin/ffmpeg -y -i';
$command .= ' ' . $this->input_file;
$command .= ' -acodec libmp3lame';
$command .= ' -ac 2';
$command .= ' -ar 44100';
$command .= ' -ab 128';
$command .= ' ' . $this->output_file;
exec($command);
これだけ。
携帯用のファイルを作りたい場合は、
AMR narrow bandを使って3gp形式にしてやればいいので、
(auとか微妙かもだけど気にしない)
$command = '/usr/local/bin/ffmpeg -y -i';
$command .= ' ' . $this->input_file;
$command .= ' -acodec libamr_nb';
$command .= ' -ac 1';
$command .= ' -ar 8000';
$command .= ' -ab 7.95';
$command .= ' ' . $this->output_file;
exec($command);
こんな感じかな。
ffmpegはmp3やAACの他RealMediaにも対応してるので、
上のinput_fileにrmファイルを指定してやれば簡単にmp3に変換可能。
もちろん始めに書いたとおり動画フォーマットもサポートしてるので、
コーデックをきちんと指定してやれば大丈夫。
例えばflvをmp3に変換するサービスなんかは、
こういう感じの環境を整えてるんだろうなーとか思う。
思うだけだけど。
FLV2MP3(仮)-ニコニコ動画やYouTubeのFLVからMP3音源を抽出して保存するWebサービス-
以上、簡単ですがレポートでした。
ちなみにデモ版サービスは…ありません;
アイディアはあっても、レンタル共有サーバってことでサーバ負荷を大きくできないことと、
共有サーバのローカルにffmpeg入れるのがアレなので。
問題はないだろうけど。