プログレスバー | ストックオーディオコンバーター

ファイルの読み取り

ファイルの変換を開始したら、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

コメントを残す

メールアドレスが公開されることはありません。