min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

PHP 動画開始からN秒後を切り出してサムネイル画像を作る「サムネイル作成」ボタン実装

 

やりたいのはこれ。こういう画面で、秒数を指定して「サムネイル作成」を押すと

f:id:min117:20160131002604p:plain

例えばこういう動画リンク(単なる文字列でしかない)に

f:id:min117:20160131002802p:plain

こんな感じでサムネイルが付く

f:id:min117:20160131002842p:plain

動画は各画像から切り出す。


● 構成

chkPID.html(切り出す秒数を指定するform) ※ファイル名に違和感あるけど無視。成り行きだから。

↓ <form action>で呼び出す

makePIC.php(サムネイル付けるPHP

 ↓ サムネイルbash の処理を呼び出す

 bashffmpeg を駆使してサムネイル画像を取り出す

 ↓

 PHPでリンクと画像を紐付けるhtmlを動的に作成

※ 結局、phpからbash呼び出して処理させるだけ。


以下ソース。

chkPID.html(該当部分のみ)

f:id:min117:20160131003545p:plain

makePIC.php

f:id:min117:20160131003759p:plain

f:id:min117:20160131003816p:plain

f:id:min117:20160131003830p:plain

f:id:min117:20160131003844p:plain

変数 $command に実行したいbash処理を入れて

exec("$command");

すれば終わる簡単な話なんだけど、いくつか注意。


① exec($command); が戻ってくるまで処理が止まる

 ブロッキングというやつか?do_ffjpg();内で呼んでるこのexec()の終わりを待ってると、ブラウザが固まっちゃう。ので

 exec("$command > /dev/null &");

してbash側でバックグラウンド実行にさせた。結果、PHPは固まらない。


② 既にサムネイル作成実行中なら処理しない

 既に実行中のプロセスがあるかを chk_bash() 関数の中でチェックするようにした。実行中プロセスがあれば、配列$ret(urn) の中にそのPIDと実行ユーザー名を格納して戻す。$ret の中身が入ってたら「実行中あり」としてエラーにする。


無事動いた。まずはこれで良しとしよう。

f:id:min117:20160131004705p:plain

PHPからbash呼んでPIDみて制御、するだけだから、他にも色々使えそうだ。

 

 

 

 

 

その買うを、もっとハッピーに。|ハピタス