[英]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.dat
和out.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.