netcommons2の動画配信モジュールが上手く動かなかった件について

netcommonsとは、PCにそれほど詳しくない一般利用者でも使いやすいように管理されているCMSであり、XOOPSベースのPHPコードによって構成されている。


このnetcommonsにて動画配信モジュールが公開されている。この動画配信モジュールを入れてみたのだが、なかなか動かない。コードを見てみると、環境によって注意すべき点がいくつかあり、やっとの思いで動作させることができた。この動画配信モジュールが目的としている所はnetcommons利用者のレベルに合わせた作りとなっており、簡単で使いやすいものになっている点が評価できる。


そこで動作しなかった場合の解決方法を書いておこうと思う。

ffmpegffmpeg-phpコンパイル

このモジュールはffmpegffmpeg-phpを利用する。手動コンパイルマニアでなければ、当然パッケージ管理システムのffmpegffmpeg-phpを利用したほうが良い。


ちなみに、ffmpeg-phpに関してはGDライブラリを利用できる状態でコンパイルする必要がある。


debianubuntuの特定バージョンによってはffmpegそのものが存在しないこともある。
そのような手動コンパイルしたいという気骨のある方は、
ffmpegの設定は

./configure --enable-gpl --enable-nonfree --enable-pthreads --enable-shared --prefix=/usr/local

ffmpeg-phpの設定は

./configure --with-php-config=/usr/local/php/bin/php-config --enable-skip-gd-check

にて上手くいったということをお伝えしたい。


尚、ffmpeg-phpのenable-skip-gd-checkとはgdライブラリを自動認識できなかった場合にgdの組み込みを強制的にenableにするものであり、gd-checkをskipすることをenableするものではないことに注意されたい。

動画配信モジュールのインストール

圧縮ファイルから展開したmultimediaディレクトリをwebapp以下moduleディレクトリの中に移動し、netcommonsに管理者権限でログインして、管理パネルからインストールを行う。

フレーム取得処理における修正

自分が検証を行ったとき、動画配信モジュールのパネルを表示し、動画をアップロードするところまでは行えたが、その後、レスポンスが発生せず、「動画がアップロードしています」という表示ダイアログで停止する状況に出会った。(ダイアログの日本語がおかしいのは気にしない)

コードを調べてみたところ、multimedia/validator/Validator_ItemUpload.class.php内の

:
$duration = $mov->getDuration();
$frame = $mov->getFrame(ceil($mov->getFrameCount()/2));
$image = $frame->toGDImage();
:

にてエラーが発生していることがわかった。


エラーの内容は、3行目の$frame->toGDImage()にて、$frameがnullであり、メソッドを解決できないということであった。そこで2行目の$mov->getFrameについて、様々な動画をアップロードして検証してみたところ、動画ファイルによっては正しくフレーム情報を取れていないことが分かった。


そもそも、この箇所は何をやっているのかというと、動画のフレーム数の取得を行い、その半分あたりのフレームを取得するという処理を行っている。

:
// $frame = $mov->getFrame(ceil($mov->getFrameCount()/2));
$frame = $mov->getFrame(1);
:

どうやら上記のコードのように最初のフレームであれば安定して取得できるようだ。動画の真ん中のフレームをサムネイルにしたいという要求はそれほど強くは無かったので、上記のコードに修正することで解決を行った。

動画変換における修正


その後、flvファイル、wmvファイル、mp4ファイルにて動画アップロードの検証を行った所、flvファイルは無事に投稿できるが、wmvファイルとmp4ファイルの投稿は失敗する事態に遭遇した。


この動画配信モジュールはflashを利用して閲覧する形式であり、flvファイルは無変換で表示する仕様になっている。それ以外のファイルはmultimedia/validator/Validator_ItemUpload.class.phpファイルに記述されているように、

$str_cmd = "/usr/local/bin/ffmpeg -y -i ".$file_dir.$file['physical_file_name']." -ar 44100 ".$file_dir.$item_name.".flv 2>&1";

によって動画変換を行う。


自分の環境では、LD_LIBRARY_PATHが/usr/local/libを指し示していなかったので、

$str_cmd = "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib /usr/local/bin/ffmpeg -y -i ".$file_dir.$file['physical_file_name']." -ar 44100 ".$file_dir.$item_name.".flv 2>&1";

と修正することで正しく動作した。


この箇所が上手くいかない場合は、ターミナル上で

/usr/local/bin/ffmpeg -i [入力ファイル名] [出力ファイル名].flv

で上手くいくかどうか確認してみると良いかもしれない。

なお、linux系ではffmpegの実行ファイルは/usr/bin/ffmpegにあることが多いため、パッケージ管理システムなどでffmpegffmpeg-phpのインストールを済ませた方は、

$str_cmd = "/usr/bin/ffmpeg -y -i ".$file_dir.$file['physical_file_name']." -ar 44100 ".$file_dir.$item_name.".flv 2>&1";

に修正すると良い。

$ which ffmpeg
/usr/bin/ffmpeg

上記のようにwhichコマンドで探しても良い。(ffmpegの前にディレクトリつけなくてもいいのになぁ)

アップロードサイズの制限

この点については実際に効くのかどうか確認をしていないので、参考程度に。意味のない設定かもしれない。


この一連のシステムにはアップロードできるファイルのサイズを制限する設定がいくつかあり、php、netcommmons、そしてmultimediaモジュールの3つにて制限を行っているように見える。この制限を修正する。

webapp/module/multimedia/config/main.ini

define:MULTIMEDIA_UPLOAD_MAX_SIZE_MEDIA = 100000000
webapp/config/global-config.ini

_UPLOAD_MAX_SIZE_IMAGE = 100000000
_UPLOAD_MAX_SIZE_ATTACHMENT = 100000000
php.ini

upload_max_filesize = 100M
post_max_size = 100M

まとめ

もし、この動画配信モジュールにて、動画アップロードの際にエラーが発生する場合は、主にmultimedia/validator/Validator_ItemUpload.class.phpを確認することで解決できた。アップロードされたファイルと生成されたサムネイルは、webapp/uploads/multimedia内にある。もしファイルのみしか存在しない状況であれば、それはサムネイルの生成に失敗しているということであり、getFrameからtoGDImage()の流れに失敗している可能性が高い。


この情報が少しでも他のnetcommonsで動画配信を行おうとしている利用者の助けになれば幸いである。

おまけ

ffmpeg-phpのINSTALLファイルにて

TROUBLESHOOTING
---------------

(省略)

Q: Can I just pay you to install it?

A: Yes. I will install ffmpeg + codecs, ffmpeg-php and flvtool2 on your server for $75 USD. This
   is everything you need to convert just about any movie type to flash.
   Shoot me an email at ffmpeg.php AT gmail.com if you are interested.

おぉぅ、オープンソースビジネス...!!!