是否有一种方法可以在上传到服务器时自行编码视频

时间:2013-01-28 19:22:17

标签: php html html5 ffmpeg mysqli

下面是我的代码,它将文件上传到服务器并将每个上传文件的名称存储到db中:

<?php

 // connect to the database
 include('connect.php');

  /* check connection */
  if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    die();
  }


    if ($_FILES['fileVideo']['error'] === UPLOAD_ERR_OK) { 

$result = 0;


if( file_exists("VideoFiles/".$_FILES['fileVideo']['name'])) {
    $parts = explode(".",$_FILES['fileVideo']['name']);
    $ext = array_pop($parts);
    $base = implode(".",$parts);
    $n = 2;

    while( file_exists("VideoFiles/".$base."_".$n.".".$ext)) $n++;
    $_FILES['fileVideo']['name'] = $base."_".$n.".".$ext;

    move_uploaded_file($_FILES["fileVideo"]["tmp_name"],
    "VideoFiles/" . $_FILES["fileVideo"]["name"]);
    $result = 1;

}
    else
      {
      move_uploaded_file($_FILES["fileVideo"]["tmp_name"],
      "VideoFiles/" . $_FILES["fileVideo"]["name"]);
      $result = 1;
  }

    $videosql = "INSERT INTO Video (VideoFile) 
    VALUES (?)";

        if (!$insert = $mysqli->prepare($videosql)) {
      // Handle errors with prepare operation here
    }

    //Assign the variable
$vid = 'VideoFiles/'.$_FILES['fileVideo']['name'];

            //Dont pass data directly to bind_param store it in a variable
$insert->bind_param("s",$vid);

 $insert->execute();
 $id = $mysqli->insert_id;

        if ($insert->errno) {
          // Handle query error here
        }

        $insert->close();     

        }else{
  echo "Upload was not successful";   
  }

?>

 <script language="javascript" type="text/javascript">
 window.top.stopVideoUpload(<?php echo $result; ?>,'<?php echo $id; ?>', '<?php echo $_FILES['fileVideo']['name']; ?>');
 </script>  

</body>
</html>

现在我正在使用jwplayer,它需要视频文件来匹配此页面上的视频格式:

http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5/12539/supported-video-and-audio-formats/

因此,当文件上传到服务器时,我需要能够在服务器上自动编码文件。我不希望用户尝试通过他们手动编码视频文件,我希望它自动完成。但我的问题是如何让自动服务器端文件编码起作用?

我有一个演示如何上传视频文件的演示:DEMO

使用演示:

  1. 点击Add Question按钮,文件输入将显示在表格

  2. 点击立即上传,您会看到一个简单的验证,说明允许哪种视频文件格式(这可以通过检查视频文件扩展名来完成)

  3. 浏览视频文件,选择然后单击Upload并等待上传完成(我建议使用短视频文件以节省时间)。上传文件时,将显示成功消息,视频文件上传到服务器,

1 个答案:

答案 0 :(得分:3)

这样做的方法很多。程序员时间最简单,最快捷的方法是使用ffmpeg直接将事物编码成可用的东西,就在你的上传脚本中(使用execsystem来实现)。

这会带来一些问题:当服务器忙于处理请求时,您的浏览器可能会暂停。而且,你无法真正分散负荷。

因此,在上传成功后,您调用ffmpeg:

exec("ffmpeg -i $vid -vcodec libx264 -vpre default -crf 21 ".
                      "-acodec libfaac -ab 128k $vid-transcoded.mp4");

您必须参考ffmpeg网站了解所有选项(很多)。此外,jwplayer非常受欢迎,因此应该有很多关于如何对其进行转码的资源。

那么,另一个解决方案是让服务器将文件上传到to_be_processed目录并有后台进程(可能是cronjob?)来处理该目录中的所有文件。这样,浏览器请求在上传完成后完成,您可以完全控制处理资源。然而,这需要花费大量的程序员时间。您必须创建处理作业,并执行一些管理工作以让用户知道处理的进度。