当我使用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.mp4
和filename
(格式化为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()
相同的命令并通过命令行使用它,它可以正常工作。
我很难过。我已经好几天都在处理这个问题了,而且还没有到达任何地方。哪里出错了?这样做有不同或更好的方法吗?我错过了什么吗?