繁体   English   中英

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

[英]Pushing file to web-browser while being written

我有一个后台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;

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

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM