在后台运行ffmpeg,以便可以更改页面

时间:2011-06-09 17:31:14

标签: php mysql linux ffmpeg

我有一个让我发疯的问题。我有一个PHP脚本,可以将文件上传到目录中。然后我可以用ffmpeg转换它但我不希望用户必须在该页面上等待,我希望它们能够在文件上运行ffmpeg时更改页面。我怎样才能实现这一点,我是使用批处理还是使用cron或什么?处理文件后,我如何能够与我的Web应用程序通信,我是否在cmd中运行php文件以添加mysql条目?

这是我的ffmpeg,如果有人能给我一些明确的话,我会非常感激。在这一点上,我愿意捐出一半的积分。

  

$ command =   shell_exec('/ usr / local / bin / ffmpeg -i   /home/geoff/Desktop/cave.wmv -acodec   libfaac -aq 100 -vcodec libx264   -preset slow -crf 22 -threads 0 /home/geoff/Desktop/newvideo.flv');

2 个答案:

答案 0 :(得分:2)

我会选择crons或者只是创建另一个将执行转换的php脚本。在用户提交表单后,处理表单并使用$ _POST将数据发送到视频转换器脚本并执行它而无需等待响应。

以下是我的框架中的一个示例,您可以根据自己的需要进行修改。

# Executing The Script
$data = array();
$data['start'] = 0;
$data['end'] = 20;

$url = SITE_ROOT.CRONS_DIR.$found->path."/".$found->name.".php";

$response = curlPost($url,$data,3,TRUE);

if ($response){
echo "<pre>";
echo htmlentities($response);
}

# curlPost function

function curlPost($url, $postArray = NULL, $timeout=2, $errorReport=FALSE) {
    # PREPARE THE POST STRING
    if ($postArray != NULL) {
        $postString = '';
        foreach ($postArray as $key => $val) {
            $postString .= urlencode($key) . '=' . urlencode($val) . '&';
        }
        $postString = rtrim($postString, '&');
    }

    # PREPARE THE CURL CALL
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_URL,            $url         );
    curl_setopt( $curl, CURLOPT_HEADER,         FALSE        );
    curl_setopt( $curl, CURLOPT_POST,           TRUE         );
    ($postArray != NULL) ? curl_setopt( $curl, CURLOPT_POSTFIELDS,     $postString ) : '';
    curl_setopt( $curl, CURLOPT_TIMEOUT,        $timeout     );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, TRUE         );

    # EXECUTE THE CURL CALL
    $htm = curl_exec($curl);
    $err = curl_errno($curl);
    $inf = curl_getinfo($curl);

    # ON FAILURE
    if (!$htm) {
        # PROCESS ERRORS HERE
        if ($errorReport) {
            echo "CURL FAIL: {$url} TIMEOUT={$timeout}, CURL_ERRNO={$err}";
            echo "<pre>\n";
            var_dump($inf);
            echo "</pre>\n";
            createLog("CURL FAIL: {$url} TIMEOUT={$timeout}, CURL_ERRNO={$err}");
        }
        curl_close($curl);
        return FALSE;
    }

    # ON SUCCESS
    curl_close($curl);
    return $htm;
 }

编辑: 你可以阅读cURL manual。这与$ _FILE无关。

让我用不同的方式解释你;

  • 您有 form.php ;这是 用户看到表单的页面 提交表格。
  • 您有 upload.php 或 的 form_process.php ;这个页面正在进行中 记录用户所需的任何数据 将表格提交到您的数据库。

在您处理用户提交数据的页面中,只需将其记录到数据库,上传文件,上传文件后,准备$ _POST数组或任何包含转换文件所需信息的数组。

例如;

$data['id'] = 100; //ID in the database
$url = "video_converter.php";
$response = curlPost($url, $data, 3, TRUE);

在video_converter.php中 - &gt;只需在$ _GET中获取ID,在找到数据库中的记录后立即转换文件,更新记录。

当然,正如我所说,你需要修改我上面写的curlPost函数以满足你自己的需要。如果您对什么是cURL有疑问,我强烈建议您先阅读cURL manual。如果您还有疑问,可以随时提出另一个问题吗?

答案 1 :(得分:1)

我认为这对你来说很清楚。之前已经发布了一些类似的问题。

http://wezfurlong.org/blog/2005/may/guru-multiplexing/

此外,搜索“PHP异步”会产生更多信息。显然你必须编辑上面的例子,但异步方法是你正在寻找的。