我想首先说我不仅仅说明FFMPEG到MP4的转换是如此缓慢,但是我希望有人可以帮我这个,因为我已经四处寻找并且没有真的知道该怎么做才能解决我的问题。
所以我找到了一个似乎为我工作的脚本,它输入了几种视频文件格式,然后转换为MP4,稍后我将允许网络用户在线观看。
FFMPEG在此脚本中完成了两项主要工作,以.jpg格式捕获静态图像,并将视频转换为MP4。经过一些调整后,脚本似乎可以工作,但起初我觉得它不起作用,它只是暂停我的服务器。
让我备份一下......我在我的开发服务器上使用FFMPEG,这实际上只是我在Windows 10上安装了XAMPP且只有2GB RAM的笔记本电脑。一旦我的网站完美运行,我将从糟糕的笔记本电脑开发环境转移到Godaddy或其他人的入门级专用服务器托管计划,因为起初我希望我网站的流量非常低。
我遇到的问题是我正在测试我将向您展示的脚本,即使使用10MB视频,也需要2分钟才能完成。同时上传进度条显示100%,因为上传实际上已完成,但没有消息让用户知道幕后发生了什么事。显然,我可以弄清楚如何解决自己,甚至只是发一条消息让他们知道这将是几分钟。当我尝试120MB的视频时,花了超过5分钟,这意味着我不仅要修改我的php.ini文件以允许这样的脚本执行时间,而且它还使我在网站上什么都不做这种情况正在发生。
我不仅无法向上或向下滚动页面,而且如果我尝试打开另一个标签并加载我的网站,它只是坐在那里有一个空白屏幕,就好像它试图访问我的网站一样。显然这是因为FFMPEG在转换视频文件期间耗尽了所有系统资源。如果我打开文件资源管理器并在正在创建的视频文件上单击一次,并继续单击它,我将看到此文件的文件大小逐渐变大和变大,这一点很明显,因为文件正在填充。这个问题当然是除了我自己处于开发阶段之外没有其他用户,所以我想知道在用户在线的专用服务器上会是什么样子。在上传视频的人完成视频后,其他用户是否无法进行任何操作?
对于120MB文件,我是否有必要将php.ini文件中的最大执行时间增加到5分钟以上?如果用户尝试上传大于120MB的文件,会发生什么?我应该把它们切掉500MB吗?
我喜欢这样的事实:我的用户可以上传视频,我可以获得缩略图甚至转换为MP4以使用HTML5显示但如果没有人(包括用户上传视频)可以将该网站用作系统,则不会激动人心资源被挂钩。我最后一次在YouTube上传了一段视频,我想我记得有一条消息说它需要几分钟才能完成,但我不记得网站完全停止了几分钟。也许这是因为我在我无足轻重的笔记本电脑上运行?
在寻找答案时,我确实遇到一些人抱怨它很慢但没有找到任何解决方案,事实上我不认为有人说它完全锁定了网站直到完成。正如我所说,我讨厌其他人无法访问我的网站或因为某人正在上传视频而被踢开。
也许这是一个常见的问题,一旦我转向生产,可以使用功能强大的专用服务器解决这个问题?我非常感谢有关如何解决此问题的任何建议,以便用户至少可以继续使用我们网站的其他区域,同时进行转换。转换完成后,我可以向他们发送警报。如果对最小的专用服务器规格有任何建议可以帮助减轻这种情况发生,我全都耳朵! :)谢谢!
以下是我目前正在使用的脚本:
<?php
include_once($_SERVER['DOCUMENT_ROOT'].'/includes/dbc.php');
// size input prevents buffer overrun exploits.
function sizeinput($input, $len){
(int)$len;
(string)$input;
$n = substr($input, 0,$len);
$ret = trim($n);
$out = htmlentities($ret, ENT_QUOTES);
return $out;
}
//Check the file is of correct format.
function checkfile($input){
$ext = array('mpg', 'wma', 'mov', 'flv', 'mp4', 'avi', 'qt', 'wmv', 'rm');
$extfile = substr($input['name'],-4);
$extfile = explode('.',$extfile);
$good = array();
$extfile = $extfile[1];
if(in_array($extfile, $ext)){
$good['safe'] = true;
$good['ext'] = $extfile;
}else{
$good['safe'] = false;
}
return $good;
}
$user_id = $_SESSION['user_id'];
// if the form was submitted process request if there is a file for uploading
if($_POST && array_key_exists("vid_file", $_FILES)){
//$uploaddir is for videos before conversion
$uploaddir = 'temp/';
//$live_dir is for videos after converted to flv
$live_dir = 'library/';
//$live_img is for the first frame thumbs.
$live_img = 'thumbs/';
$seed = time();
$upload = $seed;
$uploadfile = 'temp/'.$upload.'.mp4';
$vid_title = sizeinput($_POST['vidTitle'], 50);
$vid_title = sanitizeString($vid_title);
$vid_desc = sizeinput($_POST['vidDesc'], 2000);
$vid_desc = sanitizeString($vid_desc);
$vid_cat = (int)$_POST['vidCat'];
$safe_file = checkfile($_FILES['vid_file']);
if($safe_file['safe'] == 1){
if (move_uploaded_file($_FILES['vid_file']['tmp_name'], 'temp/'.$upload.'.mp4')) {
echo "File was successfully uploaded.<br/>";
//$base = basename($uploadfile, $safe_file['ext']);
$new_file = $seed.'.mp4';
$new_image = $seed.'.jpg';
$new_image_path = "thumbs/".$seed.'.jpg';
$new_flv = "library/".$new_file;
//exec('ffmpeg -i '.$uploadfile.' -an -ss 00:00:01-r 1 -vframes 1 -f mjpeg -y '.$new_image_path);
exec('ffmpeg -i '.$uploadfile.' -f mjpeg -vframes 1 -s 300x300 -an '.$new_image_path.'');
//ececute ffmpeg generate flv
exec('ffmpeg -i '.$uploadfile.' -f mp4 '.$new_flv);
//execute ffmpeg and create thumb
echo 'Thank You For Your Video!<br>';
//create query to store video
$sql = "INSERT INTO videos (`user_id`, `title`,`desc`, `file`, `thumb`) VALUES('".$user_id."','".$vid_title."','".$vid_desc."','".$new_file."','".$new_image."')";
echo '<img src="'.$new_image_path.'" /><br/>
<h3>'.$vid_title.'</h3>';
mysqli_query($link, $sql) or die(mysqli_error($mysql));
} else {
echo "Possible file upload attack!\n";
print_r($_FILES);
}
}else{
echo 'Invalid File Type Please Try Again. You file must be of type
.mpg, .wma, .mov, .flv, .mp4, .avi, .qt, .wmv, .rm';
}
}
?>
答案 0 :(得分:0)