在写入时将文件推送到Web浏览器

时间:2013-09-07 06:24:32

标签: php python linux file-io ffmpeg

我有一个背景ffmpeg进程正在输出音频文件,我想将此文件推送到用户web浏览器,而ffmpeg继续写入该文件。我尝试了下面但是这发送了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;

无法从PHP / Python启动ffmpeg并在此处捕获输出。

1 个答案:

答案 0 :(得分: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.datout.dat执行此操作的PHP代码:

<?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");
    }
}

请注意,睡眠的奇怪位置是为了防止在最后一次尝试阅读后休息一秒钟。

为此,我建议将空闲超时限制设置为高于10.