FFMPEG脚本不能在php中运行

时间:2016-01-11 01:17:59

标签: php video ffmpeg

我想让用户在我的网站上压缩他们的视频。网站用于Intranet环境。

我正在使用此脚本使用php压缩视频。用户可以从任何位置上传视频文件,但代码无效。

$filePath = dirname(__FILE__);
shell_exec("C:\\ffmpeg\\bin\\ffmpeg.exe -i C:\\$filePath -vcodec libx264 -crf 20 output.mp4 > logfile.txt 2>&1"); 

LOGFILE.TXT

ffmpeg version N-76822-g12a419d Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55.  9.100 / 55.  9.100
  libavcodec     57. 16.100 / 57. 16.100
  libavformat    57. 19.100 / 57. 19.100
  libavdevice    57.  0.100 / 57.  0.100
  libavfilter     6. 15.100 /  6. 15.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
C:\C:\wamp\www\testNxServer\trynewnew\menu\stream\video: Invalid argument

完整源代码

upload.php的

    <?php

$allowedExts = array("jpg", "jpeg", "gif", "png", "mp3", "mp4", "wma");
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$filePath = dirname(__FILE__);

if ((($_FILES["file"]["type"] == "video/mp4")
|| ($_FILES["file"]["type"] == "audio/mp3")
|| ($_FILES["file"]["type"] == "audio/wma")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg"))

&& ($_FILES["file"]["size"] < 20000000000)
&& in_array($extension, $allowedExts))

  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
          shell_exec("C:\\ffmpeg\\bin\\ffmpeg.exe -i C:\\$filePath -vcodec libx264 -crf 20 output.mp4 > logfile.txt 2>&1"); 
          //shell_exec("C:\\ffmpeg\\bin\\ffmpeg.exe -i video.mp4 -vcodec libx264 -crf 20 output.mp4 > logfile.txt 2>&1");
            move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

1 个答案:

答案 0 :(得分:0)

对于此段代码:

shell_exec("C:\\ffmpeg\\bin\\ffmpeg.exe -i C:\\$filePath -vcodec libx264 -crf 20 output.mp4 > logfile.txt 2>&1"); 
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);

您可以在发布的日志文件中看到它正在尝试打开C:\ C:\ ... \ video

因此,您不需要在shell查询中使用额外的C:\\。此外,您应该将输入文件放在引号中以防空格。最后,move_uploaded_file()调用似乎正在移动最初上传的文件,而不是ffmpeg生成的output.mp4文件。

所以也许这更像是你需要的东西?

shell_exec("C:\\ffmpeg\\bin\\ffmpeg.exe -i \"$filePath\" -vcodec libx264 -crf 20 \"upload\\{$_FILES['file']['name']}\" > logfile.txt 2>&1");