【问题标题】:Return of FFMPEG in Background在后台返回 FFMPEG
【发布时间】:2018-05-20 15:24:37
【问题描述】:

我正在制作一个代码,通过FFMPEG 下载m3u8 链接列表

我有这个代码:

function FFMPEG($videocode, $dirvideo) {

    $ffmpeg = '"D:\FFMPEG\bin\ffmpeg.exe"' . " -hide_banner -loglevel verbose -n -i https://linkplaylist/{$videocode}.m3u8 -map 0:1 -map 0:2 -acodec copy -bsf:a aac_adtstoasc -vcodec copy {$dirvideo} 1> log.txt  2>&1";

    exec($ffmpeg, $output, $var);

    return $var;
}

$code = FFMPEG('football', 'football.mp4');

if($code){
    {ERROR CODE}; 
    }else{

    {SUCCESS CODE}
}   

最初的问题

而且效果很好。我可以下载视频并知道它是完全下载还是有错误。

问题是这段代码“挂起”页面加载的 exec() 中的脚本,直到完成 exec() 和超时错误(共享服务器),此外页面加载对访问者来说在视觉上很奇怪。

初始问题的解决

经过研究,我认为解决方案是将代码执行放在后台,所以我找到了这段代码:

$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("file", "error-output.txt", "a") // stderr is a file to write to
);

function FFMPEG($videocode, $dirvideo) {
$cmd = 'start /B D:\FFMPEG\bin\ffmpeg.exe  -y -i "https://linkplaylist/{$videocode}.m3u8" -map p:0 -acodec copy -bsf:a aac_adtstoasc -vcodec copy {$dirvideo}';
proc_close(proc_open ($cmd
,$descriptorspec, $foo));
}

最后是我目前的问题

这对于加载和超时问题很有效,但是当下载成功完成时我无法获得返回。

1° proc_open 这是我最初问题的最佳解决方案吗?

2° ffmpeg 运行成功,脚本继续运行时,如何获得返回。

额外信息

我正在尝试构建一个适用于 Windows (xampp) 的解决方案,但我的最终服务器是 linux。

【问题讨论】:

    标签: php ffmpeg proc-open


    【解决方案1】:

    我也面临同样的挑战,希望有人能完成我的贡献。

    这只是我不知道如何为 Windows 完成的部分答案。根据 ffmpeg wiki,诀窍显然在管道中,但解决方案适用于 Unix:

    还有一点需要注意的是标准输入(stdin)。 命令行 ffmpeg 工具被设计为一个交互式实用程序, 接受用户的输入(通常来自键盘)并报告错误日志 在用户的当前屏幕/终端上。当我们在 背景,我们想告诉 ffmpeg 不应该接受任何输入 (也不等待)来自标准输入。我们可以告诉 ffmpeg,使用 I/O 再次重定向“

    我尝试使用-nostdin,但没有效果。

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多