我有一个背景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并在此处捕获输出。
答案 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.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.