目的
最後にFoltiaでMP4にエンコード時のエラーで詰まってしまう物を時間制限を付けて解除する方法を記載しておきましょう。
録画した番組がドロップノイズが多すぎたりすると、CMスキップやエンコードに非常に長時間かかってしまい、オーバーナイトで朝楽しみにしていた番組が全然エンコードされて無くて悲しい思いをされる方も多いんじゃ無いでしょうか? いわゆる便秘・フンズマリってやつですね。 まあ時間制限でCMスキップを解除しちゃうんで長めの映画なんかでCMスキップを解除しちゃう可能性もあるのでその辺は自分の環境に合わせてOn OFFしてもらうしかないでしょうね。 一応記載しておきます。
アップルスクリプト記述
私の場合、Main_Loop内に以下の様な記載を入れてます。
EncodeStatus(q) of R
その上でFoltiaRecStatus.scpt内に下のハンドラをコピペして入れて見ましょう。
--return EncodeStatus({})
on EncodeStatus(q) #★★完了
set q to q & {EncList:{}, erro:false, foltia:"foltia"}
set L to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:module:Log_forConsole_pub.scpt") as alias
--set encoder to every paragraph of (do shell script "ssh -4 foltia@" & q's foltia & ".local ps axo comm,pcpu,time,pid k -pcpu|grep -e 'comskip.exe' -e 'ffmpeg' -e 'neroAacEnc' -e 'BonTsDemuxC.exe' ||true")
(* ffmpegやneroAacEncは機種によっては継続利用されているものもあるようで 解除候補から外したが 機種によっては入れてもよいかも *)
set encoder to every paragraph of (do shell script "ssh -4 foltia@" & q's foltia & ".local ps axo comm,pcpu,time,pid k -pcpu|grep -e 'comskip.exe' -e 'BonTsDemuxC.exe' ||true")
--return encoder
set num to number of encoder
if (num is 0) then return q
repeat with i from 1 to num
set Command to do shell script "echo " & (item i of encoder)'s quoted form & "|sed -e 's/\\([^ ]*\\).*/\\1/'||true"
set CPU to do shell script "echo " & (item i of encoder)'s quoted form & "|sed -e 's/[^ ]* *\\([0-9\\.]*\\) .*/\\1/'"
set t_ to do shell script "echo " & (item i of encoder)'s quoted form & "|sed -e 's/[^ ]* *[0-9\\.]* *\\([0-9:]*\\) .*/\\1/'"
set pid to do shell script "echo " & (item i of encoder)'s quoted form & "|sed -e 's/[^ ]* *[0-9\\.]* *[0-9:]* *\\([0-9]*\\)/\\1/'"
if (CPU as number < 50) then exit repeat --CPU使用率50%以上のものをチェックする
set q's EncList to q's EncList & {{Command:Command, CPU:CPU, t_:t_, pid:pid}}
set LimitTimeMax to "02:30:00" --自分で設定してください。 環境によって時間が違います。
set LimitTimeMin to "00:40:00" --自分で設定してください。 環境によって時間が違います。
set cmt to ""
if t_ > "02:35:00" then
--ライブ録画ffmpeg用に長期過ぎると無視する様に設定する。
else if t_ > LimitTimeMax then
LogOnConsole({cmt:"★★★★エンコードに時間が掛かってる物があります", open_:false}) of L
else if t_ > LimitTimeMin then
if (Command is "BonTsDemuxC.exe") or (Command is "comskip.exe") then set cmt to "★★★★" & Command & "に作業時間掛かりすぎ、Kill -9 "
end if
if cmt is not "" then
do shell script "ssh -t -4 root@" & q's foltia & ".local \"kill -9 " & pid & "\"||true"
LogOnConsole({cmt:cmt & "実行しました。", open_:false}) of L
--slack(cmt & "実行しました。") of L
end if
end repeat
return q
end EncodeStatus
これは非常に荒っぽいハンドラなんで、利用は皆さんの好みに合わせて使ってください。 基本は ps axoコマンドで全てのプロセスを取り出した後、comskip.exe ffmpeg neroAacEnc BonTsDemuxC.exeというプロセスをgrepで抽出します。 cpu%でソートしてあるのでそれを全部取り出してencoderと言う変数にリスト形式で保管。 encoderが{}ならすぐに終了します。 今回の公開バージョンは、comskipとBonTsDemuxCだけに限定してます。 その理由は最後に記載しておきましょう。
その後はrepeatを使って、アイテムを一つづつ取り出し、プロセス名 CPU プロセス時間(t_) pidを抽出、 CPUが50%以下になったら終了させるように設定しておきます。
q's EncListという変数に上記のパラメーターをレコード値で格納しておきましょう(動作確認のためで、プロセス実行には使用しません)。
時間制限は全体でLimitTimeMaxを越えるプロセスがあれば5分間だけログにエラーが出るようにしてますが、実際にはcomskipとBonTsDemuxCに限定してますので、LimitTimeMaxが動作することはないはずです。 LimitTimeMinを越えると自動的にBonTsDemuxCとcomskipはroot権限でkill -9 <pid>されて強制終了されます。 なので自分でLimitTimeMinの中の値を自分の環境でセットしてみてください。 私の環境だと2時間番組とかでも40分以内に終わっているようなので40分にセットしてます。
このハンドラは今は自動で設定しましたが、手動でBonTsDemuxCとcomskipを kill -9する様に設計しても良いかもしれませんね。 大体録画したキャプションを見ると、もう絵がベットリスマッシュされてて、視聴出来ない番組を永遠に時間を掛けてエンコードしているわけで、それをKillして次の番組に行ってもらうという事になります。
簡単な事でMainReOpen内にこのEncodeStatusを入れてやればよいわけですね・・・。
最後に
これで一旦フォルティアのMacによる監視システム構築の本文は終了です。 しばらくは今までの原稿をもう一度見直して読みやすい様にもう一度編集して見ようと思います。
次のシリーズはウエブ小説をE-pub形式に書き出す方法をちと御紹介しとこうかなと思ってます。