使用php的exec()时ffmpeg视频转换创建空文件

时间:2014-07-23 15:26:36

标签: php video ffmpeg exec

当我使用PHP的ffmpeg函数运行exec()以将视频转换为flv时,flv文件最终为空。以下是我进行转换的代码:

    // Set our source file
    $srcFile = "/path/to/file/".$filename."mp4";
    $destFile = "/path/to/file/".$filename;
    $ffmpegPath = "ffmpeg";

    // Create our FFMPEG-PHP class
    $ffmpegObj = new ffmpeg_movie($srcFile);

    // Save our needed variables
    $srcWidth = makeMultipleTwo($ffmpegObj->getFrameWidth());
    $srcHeight = makeMultipleTwo($ffmpegObj->getFrameHeight());
    $srcFPS = $ffmpegObj->getFrameRate();
    $srcAB = intval($ffmpegObj->getAudioBitRate()/1000);
    $srcAR = $ffmpegObj->getAudioSampleRate();

    // Call our convert using exec()
    $command = $ffmpegPath . " -i " . $srcFile . " -ar " . $srcAR . " -ab " . $srcAB . "k -f flv -s " . $srcWidth . "x" . $srcHeight . " " . $destFile . "> /dev/null 2>/dev/null &";
    exec($command);

在执行上面的代码之前,我有一个上传的mp4文件,它是变量$srcFile中提到的文件。上传时,该文件不为空,我将其用作普通视频文件。

之后,会有filename.mp4filename(格式化为flv视频。是的,我尝试过给它.flv扩展名,并且没有任何不同的事情发生)文件。 filename结束为空。为了确保它运行正确的命令,我做了一个var_dump($command)来查看实际运行的命令。我得到了这个结果:

ffmpeg -i /path/to/file/filename.mp4 -ar 44100 -ab 70k -f flv -s 640x480 /path/to/file/filename

然后我运行exec()这样的功能

$output = "";
exec($command, $output);
var_dump($output);

并且喜欢这个

$output = exec($command);
var_dump($output);

两次,$output都显示为空数组。然后,我通过命令行运行上面提到的ffmpeg命令。它奏效了。它创建了flv文件,它不是空的,我可以作为常规视频文件使用,没有任何问题。

我还尝试在命令末尾添加> /dev/null 2>/dev/null &,但它仍然无效。

总而言之,到目前为止,当ffmpeg用于使用php exec()转换视频时,它会将转换为空。但是,如果我要使用与exec()相同的命令并通过命令行使用它,它可以正常工作。

我很难过。我已经好几天都在处理这个问题了,而且还没有到达任何地方。哪里出错了?这样做有不同或更好的方法吗?我错过了什么吗?

0 个答案:

没有答案