0

我拥有一个类似于 youtube 的网站 www.goploom.com,允许用户上传和观看视频。上传的视频会转换为 mp4 格式,以便与我们网站的 html5 视频播放器兼容。我的问题是,虽然 FFmpeg 成功地从上传的视频生成视频缩略图并将图像存储在正确的目录中,但我的代码的视频转换方面不会产生任何输出。我已经调整了几个小时的代码,但我无法解决这个问题,但是,我被告知我可以使用 html、php 和 ffmpeg 执行视频转换。

我的 ffmpeg 路径是正确的,因为缩略图生成完美。

**上传时从上传的视频中收集的信息。$name = $_FILES['video']['name']; $title = $_POST['videotitle']; $type = explode('.', $name);
$type = end($type); $size = $_FILES['video']['size']; $random_name = rand(); $tmp = $_FILES['video']['tmp_name'];

                if($type != 'mp4' && $type != 'MP4' && $type != 'flv' && $type != 'FLV' && $type != 'mov' && $type != 'MOV'){
                    $message = "Video Format Not Supported<br>";
                } else {
            $username_query = mysql_query("SELECT `username` FROM `users` WHERE `user_id` = $session_user_id");
                    $username = mysql_fetch_assoc($username_query); 
                    $username = $username['username'];

**完美运行的缩略图生成。$ffmpeg = "/usr/local/bin/ffmpeg"; $videoFile = $_FILES['video']['tmp_name']; $imageFile = "上传/".$username."/thumbnails/".$random_name.".jpg"; $size = "160x90"; $getFromSecond = 5; $cmd = "$ffmpeg -i $videoFile -an -ss $getFromSecond -s $size $imageFile"; if(!shell_exec($cmd)){ echo "缩略图已创建!
";
} else { echo "创建缩略图时出错!"; }

**将上传的文件移动到其永久目录以进行视频转换。$newFileLocation = "上传/".$username."/temp".$random_name.".".$type; move_uploaded_file($tmp, $newFileLocation);

*视频转换代码。$outputFile = "上传/".$username."/".$random_name.".mp4"; $databaseStoredVideoUrl = "上传/".$username."/".$random_name.".mp4"; $video_cmd = "$ffmpeg -i $newFileLocation $outputFile"; 回声 $video_cmd; if(!shell_exec($video_cmd)){ echo "视频已转换!
"; } else { echo "创建缩略图时出错!";
}

**将输出的src链接正确存储在数据库中,但是视频因为不存在而无法查看。// 在正确的用户名和用户目录下将视频存储到数据库中 mysql_query("INSERT INTO videosVALUES('$session_user_id' ,'', '$name', '$outputFile', '$title', '', '$imageFile') "); $message = "视频上传成功。
";

任何帮助或见解都会很棒。谢谢。

**编辑:通过使用以下行修复。$video_cmd = "$ffmpeg -i $newFileLocation -vcodec libx264 -vpre normal -acodec libfaac $outputFile";

然后将 $video_cmd 输入到 shell_exec

4

1 回答 1

0

不知道。曾多次使用 FFMPEG 和 PHP,您可能会遇到以下问题:

  1. 内存限制,因为您似乎正在运行视频编码服务器端,我不建议这样做。
  2. 其次,ffmpeg 进程本身可能需要很长时间,因为视频编码的执行时间可能比您的 Web 服务器 Apache/Nginx 允许的最大脚本执行时间更长。

如果您将编码作为 Web 请求运行,您应该避免这样做,而是创建一个 cron 作业或一个单独的服务来检查是否有任何新的视频需要处理和编码(视频队列服务)。

确保这一点的步骤大致如下:

  1. 首先直接从 cmdline 测试您的编码。
  2. 更新您的视频表并标记应该处理的那些,或制作一个视频队列表。
  3. 有一个 cron 作业或服务来检查要处理的新视频,然后一个一个地处理它们。

如果您最熟悉 PHP,请使用 ini_set("set_time_limit", 0) 创建一个 php 脚本,以确保您的脚本不会超时。其他选项可以是 bash 脚本,或者例如使用 node.js 以及永远ffmpeg 库来提供处理服务。

于 2013-07-12T23:13:54.500 回答