プロセスをキューに入れるには?

プロセスをキューに入れるには?

セキュリティカメラと動きが検出されたときに映像を録画するプログラムがあります。デフォルトでは、このプログラムは非常に重い形式でビデオを保存します。

私の解決策はffmpegを使ってビデオを変換するスクリプトを呼び出すことでした。このスクリプトは、画像が作成されるたびに呼び出されます。

変換には比較的時間がかかりますが、CPUを大量に使用します。変換する必要がある新しいビデオが到着し、他のビデオの変換がまだ完了していない場合、問題が発生します。この場合、スクリプトを再度呼び出すと、2つ以上のffmpegプロセスが表示され、システムがかなりの時間にわたってほぼ静止状態になります。

以前の変換ジョブが完了した後に変換ジョブが実行されるようにキューに追加するにはどうすればよいですか?私が望むのは、一度に1つのffmpegプロセスしか持たないことです。

答え1

batch次のプログラムの一部を使用できます存在するパッケージ(作業キューツール)。多くのシステムにデフォルトでインストールされます。

答え2

キューディレクトリを設定し、バックグラウンドプロセスがキューディレクトリを通過してffmpeg変換を生成します。バックグラウンドプログラムの例は次のとおりです。

queue=/var/tmp/vidq
outdir=/var/tmp/videos
while true; do  # do forever
    for file in $queue/*; do
        name=`basename $file`
        mv -f $file $queue/.current
        ffmpeg -i .current $outdir/$name
        touch -r $queue/.current $outdir/$name
        rm $queue/.current
    done
    sleep 300 # sleep for 5 minutes
done

待機中のファイルがビデオファイルでないかどうかなど、いくつかのセキュリティチェックを実行する必要があります。そして睡眠値を調整してください。ただし、これにより、名前と元の日付スタンプが同じ変換されたファイルが生成されます。

別の方法は、ファイルのロックを確認することです。 ffmpegプロセスが終了すると、ロックが削除され、別のプロセスが開始され、ファイルロックが最初に作成される可能性があります。ただし、これは論理がプログラム内に存在し、どのファイルを処理する必要があるかを追跡する必要があることを意味します。上記のキューディレクトリソリューションは、フロントエンドプログラムがそれをキューに渡すだけでよいことを意味します。

関連情報