gpt4 book ai didi

php - 在写入时将文件推送到网络浏览器

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:04 28 4
gpt4 key购买 nike

我有一个正在输出音频文件的后台 ffmpeg 进程,我想将该文件推送到用户网络浏览器,同时 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 代码中。

这是使用两个文件执行此操作的 PHP 代码,in.datout.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");
}
}

请注意 sleep 的奇怪位置是为了防止在最后一次尝试阅读后一秒钟内 sleep 。

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

关于php - 在写入时将文件推送到网络浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18670462/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com