使用PHP上传视频并显示其缩略图预览

3
我需要在特定目录中上传视频,当成功上传时,它会在页面上显示其缩略图预览:
代码:
<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="500000" />  
          <table width="400" cellpadding="3" > 
            <tr> 
              <td colspan="3"> </td> 
            </tr> 
            <tr> 
              <td width="10" rowspan="2"> </td> 
              <td width="120"><strong>Choose a file to upload:</strong></td> 
              <td width="242"><input type="file" name="uploaded_file" /></td> 
            </tr> 
            <tr> 
              <td> </td> 
              <td> </td> 
            </tr> 
            <tr> 
              <td> </td> 
              <td> </td> 
              <td><input type="submit" name="sendForm" value="Upload File" /> 
                <br /></td> 
            </tr> 
            <tr> 
              <td colspan="3"> </td> 
            </tr> 
          </table> 
</form> 
<?php 

  // C:\wamp\www\scriptDir\uploads\;

  $idir = "C:/xampp/htdocs/xampp/video";   // Path To Images Directory 
  $tdir = "C:/xampp/htdocs/xampp/video";   // Path To Thumbnails Directory 
  $twidth = "200";   // Maximum Width For Thumbnail Images 
  $theight = "150";   // Maximum Height For Thumbnail Images 

  error_reporting(E_ALL ^ E_NOTICE); // Show all major errors. 

  // Check to see if the button has been pressed 
  if (!empty($_REQUEST['sendForm'])) 
  { 
    // Assign the name to a variable 
    $name = $_FILES['uploaded_file']['name']; 
    // Assign the tmp_name to a variable 
    $tmp_name = $_FILES['uploaded_file']['tmp_name']; 
    // Assign the error to a variable 
    $error = $_FILES['uploaded_file']['error']; 
    // Assign the size to a variable 
    $size = $_FILES['uploaded_file']['size'];
    // No trailing slash 
    $uploadFilesTo = 'video'; 
    // Create safe filename 
    $name = preg_replace('[^A-Za-z0-9.]', '-', $name); 
    // Disallowed file extensions 
    //what files you don't want upoad... leave this alone and you should be fine but you could add more 
    $naughtyFileExtension = array("php", "php3", "asp", "inc", "txt", "wma","js", "exe", "jsp", "map", "obj", " ", "", "html", "mp3", "mpu", "wav", "cur", "ani");  // Returns an array that includes the extension 

    //Allowable file Mime Types. Add more mime types if you want 
    $FILE_MIMES = array('video/mpg','video/avi','video/mpeg','video/wmv'); 
    //Allowable file ext. names. you may add more extension names. 
    $FILE_EXTS = array('.avi','.mpg','.mpeg','.asf','.wmv','.3gpp') ;
    $file_ext = strtolower(substr($name,strrpos($name,".")));  
    // to check the extensio
    if (!in_array($file_type, $FILE_MIMES) && !in_array($file_ext,$FILE_EXTS) ) 
    $message = "Sorry, $file_name($file_type) is not allowed to be uploaded.";  

    $fileInfo = pathinfo($name); 
    // Check extension 
    if (!in_array($fileInfo['extension'], $naughtyFileExtension)) 
    { 
      // Get filename 
      $name = getNonExistingFilename($uploadFilesTo, $name); 
      // Upload the file 
      if (move_uploaded_file($tmp_name, $uploadFilesTo.'/'.$name))  
      { 
          // Show success message 
          echo '<center><p>Your Video File has uploaded successfully<br />'.$uploadFilesTo.'/'.$name.'</p></center>'; 
      } 
      else 
      { 
          // Show failure message 
          echo '<center><p>File failed to upload to /'.$name.'</p></center>'; 
      } 
    } 
    else 
    { 
        // Bad File type 
        echo '<center><p>The file uses an extension we don\'t allow.</p></center>'; 
    } 
  } 

  // Functions do not need to be inline with the rest of the code 
  function getNonExistingFilename($uploadFilesTo, $name) 
  { 
      if (!file_exists($uploadFilesTo . '/' . $name)) 
          return $name; 

      return getNonExistingFilename($uploadFilesTo, rand(100, 200) . '_' . $name); 
  } 
?>

我已经尝试了这段代码来上传视频并生成特定视频的缩略图,但它只显示“文件无法上传”,如果有人知道如何解决这个问题,请提供一些解决方案来完成这个任务。
1个回答

5

这里有一个简单的方法用于创建视频缩略图

您需要指定路径,缩略图将会以.jpg格式保存。

$videos_dir = 'path/to/videos';
$videos_dir = opendir($videos_dir);
$output_dir = 'path/to/output/dir/';
while (false !== ($file = readdir($videos_dir))) {
    if ($file != '.' && $file != '..'){
        $in = $videos_dir.'/'.$file;
        $out = $output_dir.$file.'.jpg';
        exec("/usr/local/bin/ffmpeg -itsoffset -105 -i ".$in." -vcodec mjpeg -vframes 1 -an -f rawvideo -s 100x100 ".$out);
    }
}

已更新

<script>
    var vidDOM = $('article').children('video');
    var vid = vidDOM.get(2);
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');

    vidDOM.bind({
        'paused':function () {
            vid.width = canvas.width = vid.offsetWidth;
            vid.height = canvas.height = vid.offsetHeight;
            var $this = this; 
            ctx.drawImage($this, 0, 0, vid.width, vid.height);
            uploadbase64();
        }
    })

    function uploadbase64(){
        canvasData = canvas.toDataURL("image/jpeg"); 
        var ajax = new XMLHttpRequest();
        ajax.open("POST",'ImageUpload.php?filename='+vidDOM.id,false);
        ajax.setRequestHeader('Content-Type', 'application/upload');
        ajax.send(canvasData);
    }
</script>



<?php
    $filename =$_GET['filename'];

    if (file_get_contents('php://input')){
        // Remove the headers (data:,) part.
        $filteredData=substr(file_get_contents('php://input'), strpos(file_get_contents('php://input'), ",")+1);

        // Need to decode before saving since the data we received is already base64 encoded
        $decodedData=base64_decode($filteredData);

        //create the file
        if($fp = fopen( $filename, 'wb' )){
            fwrite( $fp, $decodedData);
            fclose( $fp );
        } else {
            echo "Could not create file.";
        }
}

echo "Created image ".$filename;

?>

感谢您的努力,我也很抱歉,因为我忘记提到我需要在没有 "ffmpeg" 的情况下执行此任务。 - Ankit Chhatbar
@AnkitChhatbar,如果没有使用ffmpeg,你需要脚本和php。 - sanoj lawrence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接