|
Sunday, 20 June 2010 |
ビデオクリップなんかをウェブサイトに掲載しようとして、ビデオの形式を変換するソフトを試してりしてる間に、必ずお世話になっていること間違いなしのビデオ変換ソフトFFMPEGですが、WindowsにもLinuxにも対応し、動画に関することでできないことはないんじゃないかと思うくらい高機能です。
FFMPEGは動画を掲載するウェブサイトでのビデオ形式の変換の他に、ビデオクリップを再生する前のプレビュー画像を作成する時にも使われており、掲載されているビデオの一場面を再生前に確認できることは最早、当たり前のようになっています。
ローカルでFFMPEGを使ってプレビュー画像を作成する方法は至って簡単で、コマンドラインから幾つかのオプションを指定するだけなんですが、実のところこれをウェブサイト上で実現しようとすると、結構面倒臭かったりします。
FFMPEGはその性質上、かなり処理が重いことは想像に難くはありませんが、このせいでFFMPEGを標準ではインストールさせないホスティングサービスが多く、FFMPEG対応を売りにするホスティングサービスもありますが、やはりちょっと割高感があって、簡単には使えません。
安い共用のホスティングサービスを利用しておきながら、FFMPEGを利用してCPU負荷をいたずらに上げるのは確かにいただけませんが、何もオンラインビデオ変換サイトやYoutubeのような高負荷なサイトを作ろうと言うのではなく、掲載しているビデオクリップのプレビュー画像を作るために利用すると言うのが目的ですから、そんなにサーバーに負荷はかかりません。
あらかじめローカルでプレビュー画像を作れば良いんですが、それはさすがに手間が掛かるのでビデオクリップをアップロードして、ウェブサイトがロードされる時に自動的にプレビュー画像を作る(該当する画像があれば何もしない)のが理想です。
ネットを検索すると、ホスティングサービスがLinuxの場合、あらかじめ標準的なオプションでコンパイルされたFFMPEGを使えば共用ホスティングサービスでも利用可能(保証はなし)との記述が見つかります。
世の中には色々なことを試されている人がいるようで、既にコンパイル済みのFFMPEGは比較的簡単に手に入るので、これを適当な場所へアップロード、自分のホスティングアカウントにSSHでアクセスすれば、コマンドラインからFFMPEGが動作するかどうかを確認することが出来ますが、SSHアクセスには個人認証が必要(運転免許の提示等)で、何だか積極的に使う気にはなりません。
という訳で、FFMPEGが正常に動作するかどうかは、実際にウェブサイトを運用する際に使用するPHP(のようなサーバーサイドスクリプト)から行う必要があります。
PHPは外部のプログラムも実行することができるため、FFMPEGをPHPから呼び出してプレビュー画像を切り出すこともできそうです。
LinuxのターミナルやWindowsのコマンドプロンプトからは、
ffmpeg -itsoffset -4 -i video.flv -vcodec mjpeg -vframes
1 -an -f rawvideo -s 320x240 video.jpg 2>&1
こんな感じでFFMPEGを実行すれば、ビデオクリップと同じフォルダに画像ファイルが作成されるはずです。
PHPでは、
<?php
$cmd='ffmpeg -itsoffset -4 -i video.flv -vcodec mjpeg -vframes
1 -an -f rawvideo -s 320x240 video.jpg 2>&1';
exec($cmd);
?>
最小限のコードで書くならこんな感じでしょうか。
Windows版のコンパイル済み(バイナリ)FFMPEGをダウンロードして、video.flvとPHPを実行できるフォルダへ移動、上記のPHPを実行すると同じフォルダに見事、video.jpgが保存されるはずです。
と言うことは、ホスティングサーバー上のLinuxにFFMPEG(Linux用バイナリ)をコピー、実行権限を与え(chmod 755)、同じPHPを実行すればFFMPEGそのものは問題なく動作することになりますが、結果はNGでした。
きちんとインストールしないでバイナリのFFMPEGを使用しているのがいけないのでしょうか、それともPHPのコードがおかしいのでしょうか。
色々とネットでリサーチしてみても、LinuxホストでFFMPEGがうまく動作しないと言う人はたくさんいるようですが、”変なことをせずにFFMPEGをサポートしているホスティングサービスを利用して、そこのサポートに連絡するのが一番”と言うのが多く(最もなんですが)、明確な回答が分かりません。
諦めてしまえば一番簡単なんですが、実は過去に同じホスティングサービスで写真や動画をアルバム形式で見せるシステムをインストールした際、バイナリのFFMPEGを使ってビデオクリップのプレビュー画像を出すモジュールがあったのを記憶しており、適切なコードを書けばFFMPEGそのものは動くはずで、ちょっと簡単に諦める訳には行きません。
という訳で、更に手を変え品を変え試してみた結果、とんでもないことに気が付きました。
<?php
$cmd='./ffmpeg -itsoffset -4 -i video.flv -vcodec mjpeg -vframes
1 -an -f rawvideo -s 320x240 video.jpg 2>&1';
exec($cmd);
?>
Linuxではシェルスクリプトの実行時にパスを記述する必要があり、"./"がカレントディレクトリの場合であってもコマンドの前に必要になります。
試しにこのパスを追加してPHPを実行すると、なんと、嘘のようにプレビュー画像を作成することができました。
これで何とか目標は達成できそうですが、ちょっとした問題が残ります。
というのも、ローカルではWindows上でPHPの動作確認を行っているのですが、WindowsとLinuxとで異なるコードが必要と言うことになると、ローカルで動作確認が出来ない上、PHPを編集する度にFTP等でファイルを送信する必要があります。
何だか新たな問題にぶち当たって一瞬、憂鬱な感じがしましたが、PHPにはオペレーティングシステムの種類を取得する便利な関数があって、取得したオペレーティングシステムの種類によって実行するコマンドを変えれば、WindowsでもLinuxでも一つのPHPファイルで事足ります。
echo php_uname('s');
後は、PHPの関数なりクラスなりを適当に作って、ビデオクリップを表示する前にプレビュー画像のチェック(なければ作成、あれば何もしない)を行えば、目的は達成です。
このページの情報は、ホスティングサービスによっては規約違反になる場合があり、アカウントの停止、契約の解除等、予期しない結果を招く恐れがあります。
|