FFMPEGを使ってサーバサイドでmp3 → 3gp変換。


ffmpegとは?

簡単に言うと、動画ファイル/音声ファイルを別の形式に変換してくれるソフトウェア。
ソフトウェアと言ってもメールソフトのようなアプリケーションではなくて、
変換を行うプログラム、と言った方が正しいか。
ffmpegをローカルで使用すれば、携帯動画変換君みたいなプログラムになるし、
サーバ上で使えば自動的に変換処理してくれるサービスなんかも書ける。
そんな便利なもの。

1ヶ月ちょっと前にffmpegを使って、ちょっとした処理をサーバで行うプログラムを書いたので、
その辺のまとめ。

FFmpeg

まずは、インストール。

携帯動画変換君のようなローカルで使うアプリケーションの場合、
パッケージの中にffmpegを同梱している場合が多いと思うけれども、
今回はサーバで使うのでおもむろにサーバにインストール。

コーデックの種類が多くて関連して入れたいライブラリも多いので、
詳しいサイトを参考に1つ1つ確認しながらやった方がよさげです。
まぁライブラリくらいなら後でも何とかなりますけどね。
(再コンパイルは必要だけど)

参考サイト

  1. 3G携帯の動画を扱うためのffmpegのビルド方法 – blog.katsuma.tv
  2. Vine Linux への FFmpeg インストールと、使い方(2007年11月Ver)

インストールに関しては、上記サイト(参考リンク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入れるのがアレなので。
問題はないだろうけど。