2016-11-15 9 views
0

動画をアップロードできるサービスを提供しています。ファイルサイズが大きいため、アップロード後にこれらの動画を変換したいと思います。アップロード後に動画を変換する

アップロードが完了すると、ビデオが(FFMPEGを使用して)変換されるPHPスクリプトが呼び出されるようにします。変換が完了すると、ユーザーはビデオが使用可能であるという通知を受け取ります。

私は、POSTで送信されたパスを使用する別のPHPスクリプトを考えています。次に、shell_exec()内のFFMPEG行を呼び出します。しかし、どのようにバックグラウンドで実行し、プロセスが完了したときにユーザーに通知を送信することができますか?

答えて

1

キュー機構を実装する必要があります。たとえば、最初のスクリプトはユーザーと対話し、ファイルをアップロードし、新しいジョブをキューに挿入します。 2番目のスクリプトはスケジューラ(Linuxではcrontab、Windowsではタスクスケジューラ)によって毎分バックグラウンドサーバプロセスとして開始されます。キューが空でない場合、バックグラウンドスクリプトはキューから最も古いジョブを受け取り、ffmpegを実行します。 ffmpegが終了し、shell_execが制御を返すときは、このジョブを「準備完了」としてマークする必要があります。このようなキューを実装する最も簡単な方法は、単純なDBテーブルです。 RabbitMQ。

また、3番目のスクリプトを記述してジョブの状態を確認し、X秒ごとにAJAXでユーザーインターフェイスから呼び出すことをお勧めします。

0

私は、Vladislavと同様のシステムを実装しました。私は一度に2つのffmpegジョブを実行するためにこのtask spoolerを使用します(ハードウェアに応じて変更してください)。キューを設定しないと、数十から数百のクリップを同時にトランスコードしようとすると、サーバーを停止させる可能性があります。 Webサービス用にいくつかのスレッドを開いたままにしておきます。私はPHPファイル(ajaxを介してチェックされている)を書いています。このファイルは、ユーザのフィードバックをキューに入れるシェルスクリプトを呼び出します。ここにはbashシェルスクリプトのビジネス上の終わりがあります。

STATUS=$(ts | grep $NEWNAME | awk '{print $2}') 
if [ "$STATUS" = "running" ] || [ "$STATUS" = "finished" ]; then 
     CURRID=$(ts | grep $NEWNAME | awk '{print $1}') 
     PID=$(ts -p $CURRID) 
     echo "p$PID" 
     exit 0 
elif [ "$STATUS" = "queued" ]; then 
     RUNNINGID=$(ts | grep running | awk '{print $1}') 
     CURRID=$(ts | grep $NEWNAME | awk '{print $1}') 
     LASTQ=$(ts | grep queued | tail -1 | awk '{print $1}') 
     ALLQ=$(($LASTQ-$RUNNINGID)) 
     LEFT=$(($CURRID-$RUNNINGID)) 
     echo "q$LEFT.$ALLQ" 
     exit 0 
else 
     echo "done" 
fi 
関連する問題