FFMPEG脚本不在php中运行


FFMPEG script does not run in php

我正在尝试让用户在我的网站中压缩他们的视频。网站是在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

完整源代码

上传.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";
  }
?>

对于这部分代码:

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:''。。。''视频

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

所以也许这会更像你需要的?

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