ダウンロードした動画をNTTドコモiモーションの3gp形式に変換
FFMPEG-PHP ClassのVideoToクラスを参考にPHPVideoToolkitクラスを利用した3gp形式の動画変換クラスを作成します。VideoToクラスのFLVメソッドを参照すると、メソッドに渡されたオプションとメソッド内で指定したオプションをマージした後、さらにset~メソッドを使って動画変換のオプションを指定してffmpegのコマンドを組み立てていることが分かります。
public static function FLV($file, $options=array(), $target_extension='flv')
{
// merge the options with the defaults
$options = array_merge(array(
'temp_dir' => '/tmp/',
'width' => 320,
'height' => 240,
'frequency' => 44100,
'audio_bitrate' => 64,
'video_bitrate' => 1200,
# 略
, $options);
// set the output dimensions
$toolkit->setVideoAspectRatio($options['ratio']);
$toolkit->setVideoOutputDimensions($options['width'], $options['height']);
$toolkit->setVideoBitRate($options['video_bitrate']);
$toolkit->setVideoFrameRate($options['frame_rate']);
# 略
作成する3gp動画変換用のクラスもVideoToクラスにならって作成する方式で進めていきます。
videoto.phpをコピーしてmobilevideotop.phpの名前で保存します。クラス名をMobileVideoTo、FLVメソッドをコピーしてGPの名前で以下のようにクラスを作成します。
class MobileVideoTo
{
private static $_log_files = array();
private static $_error_messages = array();
private static $_commands = array();
private static $_outputs = array();
public static function GP($file, $options=array(), $target_extension='3gp')
{
// merge the options with the defaults
$options = array_merge(array(
'temp_dir' => '/tmp/',
ffmpegを使ってのflvから3gpへの動画変換のコマンドの例は以下のようになります。
ffmpeg -i youtube.flv -vcodec mpeg4 -b 64k -s qcif -r 15 -acodec libamr_nb -ab 12200 -ar 8000 -ac 1 -flags bitexact youtube.3gp
その際のオプションの意味と3gp動画変換時の値の目安は以下の表のとおりです。
| オプション | オプションの意味 | 3gp動画変換時の値の目安 |
| -i | 変換前の動画ファイルを指定 | 動画ファイル名 |
| -vcodec | ビデオコーデックを指定 | 「mpeg4」を指定する |
| -b | ビットレートを指定 | 60~100kを指定する |
| -s | フレームサイズを指定 | 最小の単位である「qcif」を指定する |
| -r | フレームレートを指定 | 10~50程度を指定する |
| -acodec | オーディオを指定 | 「libamr_nb」を指定する |
| -ab | オーディオビットレート | 10000~20000の間 |
| -ar | オーディオサンプリング周波数を指定 | 8000固定 |
| -ac | オーディオチャンネル数を指定 | 1 |
| -flags | エンコードに関するフラグ | 携帯向け変数「bitexact」を指定する |
上記例ではなるべく多くの機種に対応した値をとっているので、変換後の動画の精度を上げたい場合などは、ffmpegドキュメントを参照して調整してください。
VideoToクラスのFLVメソッドで多用されているPHPVideoToolkitのset~のメソッドはaddCommandメソッドでも同じことを指定できます。サンプルではffmpegのオプションを分かりやすくするためにaddCommandメソッドで動画変換のオプションを組み込んでいます。
// ビデオフォーマットをmpeg4に設定
$toolkit->setVideoFormat(PHPVideoToolkit::FORMAT_MPEG4);
// ビデオビットレートを64kに設定
$toolkit->setVideoBitRate('64k');
// フレームレートを30に設定
$toolkit->setVideoFrameRate(30);
// フレームサイズを設定
$toolkit->addCommand('-s', 'qcif');
// オーディオコーデックをlibamr_nbに設定
$toolkit->addCommand('-acodec', 'libamr_nb');
// オーディオビットレートを12200に設定
$toolkit->addCommand('-ab', 12200);
// オーディオサンプリング周波数を8000に設定
$toolkit->addCommand('-ar', 8000);
// オーディオチャンネル数を1に設定
$toolkit->addCommand('-ac', 1);
// 携帯向け動画であることを指定
$toolkit->addCommand('-flags', 'bitexact');
addCommandメソッドを利用することでffmpegのコマンドを直接編集せずに動画変換時のオプションを指定できます。GPメソッドの作成が終わったら、前項のPHPに以下の行を追加します。
MobileVideoTo::ThreeGP($_output, array('output_dir'=>'/var/www/html/', 'output_file'=>'youtube.3gp'));
PHPを実行すると、YouTubeの紹介動画をダウンロードして3gpへ変換します。変換後のファイル名は「youtube.3gp」としています。前回記事で最初に作成したサンプルを使ってhttp://[ドメイン]/3gp.php?file=youtube.3gpでアクセスすると以下のように表示されます。

携帯電話でアクセスして動画が閲覧できることを確認します。
まとめ
FFMPEG-PHP Classを利用することでffmpegのコマンドを直接触らずにPHP内から動画変換が行えます。ffmpeg自体が多様な動画フォーマットに対応しているので、オプションの指定次第で様々な端末に対応した動画が生成できるものと考えています。
また、Zend_Http_Clientはスパイダリングツールとしても利用できるため、各動画共有サイトを横断して特定の種類の動画を収集したり、あるサイトからそのサイトの趣旨に合った動画や他サイトの情報を収集しリンクを張るなど、個人レベルでもポータル的なサイトの作成が可能になるでしょう。
