1

オーディオ ファイルを出力するバックグラウンド ffmpeg プロセスがあります。ffmpeg がファイルに書き込みを続けている間に、このファイルをユーザーの Web ブラウザーにプッシュしたいと考えています。以下を試しましたが、これは0バイトのファイルを送信します。

// open the file in a binary mode
$fp = fopen($fname, 'rb');

// send the right headers
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($fname));
ob_end_clean();
fpassthru($fp);
exit;

ffmpeg は PHP/Python から起動できず、ここで出力がキャプチャされます。

4

1 に答える 1

0

関数はここfpassthruでは機能しません。さらに、ファイルがいつ完成するかを知るという問題が発生します。

ファイルの最後に達すると、ファイルの読み取り関数は停止します。ファイルの長さを増やしている並行ライターが存在する場合、EOF が表示される前にリーダーがどこまで到達するかは不確定です。さらに、ファイル ライタが完了したかどうかをファイル操作を通じて知る明確な方法はありません。

次のようなループ (疑似コード) を使用して、タイムアウトで読み取りを試行することが実行可能である可能性があります。

LOOP
    READ bytes
    IF count read == 0
    THEN
        SLEEP briefly
        INCREMENT idle_count
    ELSE
        SET idle_count = 0
        WRITE
    END IF
UNTIL ( idle_count == 10 )

役立つ場合は、それを PHP コードに入れることができます。

in.dat2 つのファイルでこれを行う PHP コードを次に示しますout.dat

<?php

$in_fp = fopen("./in.dat", "r");

$out_fp = fopen("./out.dat", "w");

$idle_count = 0;

while ( $idle_count < 10 )
{
    if ( $idle_count > 0 )
        sleep(1);

    $val = fread($in_fp, 4192);
    if ( ! $val )
    {
        $idle_count++;
    }
    else
    {
        $idle_count = 0;
        $rc = fwrite($out_fp, $val);
        if ( $rc != strlen($val) )
            die("error on writing of the output file\n");
    }
}

スリープの奇妙な位置は、最後に読み取りを試みてから 1 秒後にスリープしないようにするためであることに注意してください。

この目的のために、アイドル タイムアウト制限を 10 よりも高く設定することをお勧めします。

于 2013-09-07T06:32:18.820 に答える