Foltia with AppleScript

Foltia animelockerのトラブルシューティング

Foltiaエンコードエラーの自動解除:アップルスクリプト

目的

最後に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")

     (* ffmpegneroAacEncは機種によっては継続利用されているものもあるようで 解除候補から外したが 機種によっては入れてもよいかも *)

     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形式に書き出す方法をちと御紹介しとこうかなと思ってます。