ファイルの読み取り
ファイルの変換を開始したら、FFmpegのコマンド-progress
で指定したテキストファイルから進行状況を読み取ります。このファイルをprog.txtとすると、
$content = @file_get_contents(prog.txt);
file_get_contents()
で、ファイルprog.txtの文字列を変数$content
に格納します。この関数はファイルの読み取りに失敗した時にfalseを返すのですが、同時に警告としてエラーも表示されるので、それを回避するために、関数の先頭に@
を付与します。
プロセスの状態
上記の関数がfalseを返した時は、FFmpegのプロセスの状態をコマンドで確認します。プロセスIDを$pid
とすると(参考)、
$stat = shell_exec('ps -q '.$pid.' -o stat --no-headers');
shell_exec()
はexec()
と同様にコマンド実行の関数で、コマンドの出力を文字列として返します。ps
はタスクのプロセス一覧を確認するコマンドで、オプションの-q
はその中からプロセスIDを指定して選び、-o
で必要な項目を抽出します。最後に--no-headers
を付けて区分けの文字列を排除します。この操作で取得したstat
のコードの意味は、manページ等で確認します。
変換の進行状況
FFmpegの進行状況は、変換中であればprogress=continue
が、変換が完了すればprogress=end
が、prog.txtに追記されるので、特定の文字列の位置を判別するstrpos()
を用いて確認します。
$bool = strpos($content,'end')===false;
第2引数で指定する文字列が含まれていない場合にはfalseを返すので、上記のように判定します。
進度の取得
変換の進度を秒数で取得します。一定周期で、変換したデータの秒数がprog.txtに追記されるので、ここではpreg_match_all()
を用います。
preg_match_all('/out_time_ms=(.*)\n/',$content,$durAry);
第1引数のパターンにマッチしたすべての文字列が、第3引数に多次元配列として下記のように格納されます。
Array ( [0] => Array ( [0] => out_time_ms=24706032 [1] => out_time_ms=49690703 [2] => out_time_ms=76068571 [3] => out_time_ms=80000000 ) [1] => Array ( [0] => 24706032 [1] => 49690703 [2] => 76068571 [3] => 80000000 ) )
必要な値は最後に追記されたものなので、これをarray_pop()
を用いて取り出します。
$durCur = array_pop($durAry[1]);
out_time_ms
の単位はマイクロ秒(10-6秒)なので、後の計算のために秒にします。
$durCurSec = $durCur*10**-6;
URL: sac.ringil-music.com
環境: さくらのVPS・Centos7・Nginx・PHP-FPM