1

PHPでHandBrakeCLIを使用するときに、行ごとにリアルタイムで表示する別の方法はありますか? これまでのところ、proc_open() 関数でfgets()を使用してバイト単位で取得しています。fgets() のマニュアルでは、長さについて次のように言及されています。これまでのところ、改行は認識されません。

// disable output buffering so we can send the encoding progress to the browser.
ob_implicit_flush(true);

$Command = 'HandBrakeCLI -i "/tmp/in-1.FLV" -t 1 -c 1 -o "/tmp/out.mp4" -f mp4 --strict-anamorphic  -e x264 -q 20 --cfr  -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0 --gain=0 --audio-copy-mask none --audio-fallback ffac3 -x ref=1:weightp=1:subq=2:rc-lookahead=10:trellis=0:8x8dct=0';

echo 'Starting...';

ob_flush();
flush();

$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from (we do not use it).
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to and we will read from.
   2 => array("pipe", "w") // stderr is a file to write to (we do not use it).
);

// We do not use exec() because we want to get the Stdout line by line.   
$process = proc_open($Command, $descriptorspec, $pipes);

if(is_resource($process))
{
    $line = 1;
    while(!feof($pipes[1]))
    {
        $InputLine = fgets($pipes[1], 1024);
        if(strlen($InputLine) == 0) break;
            echo '<pre><strong>Line: '.$line++.'<br /></strong>';
                print_r($InputLine);
            echo '</pre>';
        ob_flush();
        flush();
    }
    fclose($pipes[0]);
    fclose($pipes[1]);
    fclose($pipes[2]);
}
echo 'Done!';

現在の出力:

起動...

ライン1
エンコーディング: タスク 1/1、3.10 % エンコーディング: タスク 1/1、6.61 % エンコーディング: タスク 1/1、8.81 % エンコーディング: タスク 1/1、11.44 % エンコーディング: タスク 1/1、14.52 % エンコーディング: タスク 1/1、18.03 % エンコーディング: タスク 1/1、21.10 % エンコーディング: タスク 1/1、25.05 % エンコーディング: タスク 1/1、27.25 % エンコーディング: タスク 1/1、29.03 % エンコーディング: タスク 1/1、29.91 % エンコーディング: タスク 1/1、33.45 % エンコーディング: タスク 1/1、36.52 % エンコーディング: タスク 1/1、39.19 % (316.92 fps、平均 318.50 fps、ETA 00h00m06s) エンコーディング: タスク 1/1、42.46 % (316.92 fps、平均 318.50 fps、ETA 00h00m06s) エンコーディング: タスク 1/1、46.44 % (316.92 fps、平均 318.50 fps、ETA 00h00m06s) エンコーディング: タスク 1/1、47.32 % (316.92 fps、平均 318.50 fps、ETA 00h00m06s) エンコーディング: タスク 1/1、49.96 % (294.34 fps、平均 315.56 fps、ETA 00h00m05s) エンコーディング: タスク 1/1、53.03 % (294.34 fps、平均 315.56 fps、ETA 00h00m05s) エンコーディング: タスク 1/1、56.54 % (294.34 fps、平均 315.56 fps、ETA 00h00m05s) エンコード: タスク 1/1、61.08 % (336.12 fps、平均 330.04 fps、ETA 00h00m04s) エンコーディング: タスク 1/1、
ライン: 2
61.95 % (336.12 fps、平均 330.04 fps、ETA 00h00m04s) エンコード: タスク 1/1、65.03 % (336.12 fps、平均 330.04 fps、ETA 00h00m04s) エンコーディング: タスク 1/1、67.13 % (336.12 fps、平均 330.04 fps、ETA 00h00m04s) エンコード: タスク 1/1、68.89 % (320.33 fps、平均 319.28 fps、ETA 00h00m03s) エンコード: タスク 1/1、71.12 % (320.33 fps、平均 319.28 fps、ETA 00h00m03s) エンコーディング: タスク 1/1、74.42 % (320.33 fps、平均 319.28 fps、ETA 00h00m03s) エンコード: タスク 1/1、76.65 % (307.54 fps、平均 312.58 fps、ETA 00h00m02s) エンコーディング: タスク 1/1、79.72 % (307.54 fps、平均 312.58 fps、ETA 00h00m02s) エンコード: タスク 1/1、83.38 % (307.54 fps、平均 312.58 fps、ETA 00h00m02s) エンコード: タスク 1/1、86.01 % (285.58 fps、平均 315.19 fps、ETA 00h00m01s) エンコーディング: タスク 1/1、87.33 % (285.58 fps、平均 315.19 fps、ETA 00h00m01s) エンコード: タスク 1/1、89.08 % (285.58 fps、平均 315.19 fps、ETA 00h00m01s) エンコーディング: タスク 1/1、91.72 % (285.58 fps、平均 315.19 fps、ETA 00h00m01s) エンコーディング: タスク 1/1、94.79 % (278.94 fps、平均 307.07 fps、ETA 00h00m
ライン: 3
00 秒) エンコーディング: タスク 1/1、96.99 % (278.94 fps、平均 307.07 fps、ETA 00h00m00s) エンコーディング: タスク 1/1、100.00 % (278.94 fps、平均 307.07 fps、ETA 00h00m00s) エンコーディング: タスク 1/1、100.00 % (278.94 fps、平均 307.07 fps、ETA 00h00m00s)
終わり!

結果は改行を考慮せず、1024 バイトに達するまで検索を続けます。出力をリアルタイムで行ごとに表示するために使用できる別の方法はありますか?

4

1 に答える 1

3

fgets() の代わりに fread() を使用してください。fread() はバイナリセーフです。

于 2012-11-22T17:53:35.860 に答える