犬ターネット

ffmpeg + ffmpeg-php で m4a のタグ情報を読み込む

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 使わないとダメかも。


おれ

OpenCVとPHP用顔検出拡張(face_detect)使って顔検出するまで