2011-06-22 php
ffmpeg + ffmpeg-php で PHP から m4a のタグ情報を読み込んでみる。環境は CentOS、PHP-5.3.3。
まず ffmpeg をインストール。ffmpeg-php のコンパイルに必要なので ffmpeg-devel もインストール。
$ yum install ffmpeg $ yum install ffmpeg-devel
次に ffmpeg-php 本体を ここ からダウンロード、/usr/local/src/ に配置してコンパイル。
$ cd /usr/local/src/ $ tar -xjf ffmpeg-php-0.6.0.tbz2 $ cd ffmpeg-php-0.6.0 $ phpize $ ./configure $ make … /usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c: In function ‘zim_ffmpeg_frame_toGDImage’: /usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c:336: error: ‘PIX_FMT_RGBA32’ undeclared (first use in this function) /usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c:336: error: (Each undeclared identifier is reported only once /usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c:336: error: for each function it appears in.) /usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c: In function ‘zim_ffmpeg_frame_ffmpeg_frame’: /usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c:421: error: ‘PIX_FMT_RGBA32’ undeclared (first use in this function) make: *** [ffmpeg_frame.lo] エラー 1
エラー。調べたら回避方法がすぐ見つかったので修正。
$ vim ffmpeg_frame.c 336: _php_convert_frame(ff_frame, PIX_FMT_RGBA32); 421: avpicture_alloc((AVPicture*)frame, PIX_FMT_RGBA32, width, height); 432: ff_frame->pixel_format = PIX_FMT_RGBA32; ↓ 336: _php_convert_frame(ff_frame, PIX_FMT_RGB32); 421: avpicture_alloc((AVPicture*)frame, PIX_FMT_RGB32, width, height); 432: ff_frame->pixel_format = PIX_FMT_RGB32;
念のため make distclean してから再コンパイル。
$ make distclean $ ./configure $ make … Build complete. Don't forget to run 'make test'.
作成された ./modules/ffmpeg.so をコピー、併せて php.ini も修正。
$ cp ./modules/ffmpeg.so /usr/local/lib/php/extensions/ $ vim /usr/local/lib/php.ini extension_dir = "/usr/local/lib/php/extensions" extension=ffmpeg.so
php から ffmpeg.so モジュールが読み込まれているか確認。
$ php -m … face_detect ffmpeg fileinfo …
サンプルPHPスクリプトを書いてみる。手元の .m4a はデータ取得できた。
$ vim test.php <?php $file_path = './sample.aac'; $m = new ffmpeg_movie($file_path); echo 'comment : ', $m->getComment(), "\n", 'title : ', $m->getTitle(), "\n", 'artist : ', $m->getArtist(), "\n", 'copyright: ', $m->getCopyright(), "\n", 'genre : ', $m->getGenre(), "\n", 'track : ', $m->getTrackNumber(), "\n", 'year : ', $m->getYear(), "\n" ; $ php test.php comment : title : Recreate artist : Born Of Osiris copyright: genre : track : 5 year : 2011
.mp3 だと手元の環境ではこんな感じになって何も表示されない。
$ php test.php [mp3 @ 0x9a69be0]max_analyze_duration reached [mp3 @ 0x9a69be0]Estimating duration from bitrate, this may be inaccurate comment : title : artist : copyright: genre : track : 0 year : 0
.mp3 の場合は ID3 使わないとダメかも。