0

我的问题是 FFMpeg 和 Mencoder 资源丰富,即使运行其中一个进程也会使 HTTPd 变慢,但(FFMPEG /Mencoder)的多个进程只是完全挂起它(HTTPd)。例如,我希望使用 Beanstalk 处理我的转换。

我的具体问题是:如何将我目前的工作转移到 Beanstalk?

我有一个触发转换的简单PHP代码:

RunInBackground('convert.php', array($upload, $video_id), $log_path);

现在 Beanstalk 正确的代码会是什么样子,这样如果上传了多个视频,这些进程就不会同时启动?

如果您认为我的需要最好使用除 Beanstalk 之外的其他东西,并且您知道如何实现它,我仍然很高兴看到它!

提前致谢,
伊利亚

4

2 回答 2

3

两种可能性:
- 尝试使用 xuggler 进行转换 - 内联运行,而不必生成作业
- 使用数据库或文件创建“文件处理队列”。让您的转换过程只查询“要处理的未完成文件”,但只有一次运行其中一个。它将独立于您的主要任务运行,但可以将其状态发布在您的主要工作可以读取的位置。例如“忙碌”或“队列中有 3 个文件”或“可用”

于 2012-07-13T16:48:47.670 回答
1

基于 ethrbunny 提供的好主意,我决定不使用 Beanstalk 或 Resque 来实现我的目标!毕竟我很高兴!我敢打赌,对于所有试图将 FFMpeg / MPlayer / MEncoder 进程限制为服务器上唯一一个活动进程以保持其他进程正常运行的人来说,这将是有用的,例如 httpd。

一步步!

  1. 创建一个数据库,我称之为“encoding_queue”:

     CREATE TABLE IF NOT EXISTS `encoding_queue` (
    `queue_timestamp` int(11) NOT NULL DEFAULT '0',
    `uploaded_video_id` int(11) NOT NULL DEFAULT '0',
    `uploaded_file_name` varchar(255) NOT NULL DEFAULT '',
    `log_file_path` varchar(255) NOT NULL DEFAULT '',
    PRIMARY KEY (`queue_timestamp`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
    
  2. 在您的主上传文件中,就在您触发转换过程的位置:

    // Let's check if ffmpeg, mplayer, mencoder or mediainfo processes are running //   
    exec("ps ax | grep -v grep | grep ffmpeg", $ffmpeg);
    exec("ps ax | grep -v grep | grep mplayer", $mplayer);
    exec("ps ax | grep -v grep | grep mencoder", $mencoder);
    exec("ps ax | grep -v grep | grep mediainfo", $mediainfo);
    
    if(empty($ffmpeg) && empty($mplayer) && empty($mencoder) && empty($mediainfo)) {
    // As non of them are running we start conversion process //
    
       RunInBackground('convert.php', array($uploaded_file_name , $uploaded_video_id ), $log_file_path);
    
    } else {
    
    // As the ffmpeg or mplayer or mencoder or mediainfo is running we add the process to the queue into the database//
    
       //Connecting to database using ADOdb //             
    
       $sql = "INSERT INTO encoding_queue SET queue_timestamp = '" .time(). "', 
       uploaded_video_id = '" .mysql_real_escape_string($uploaded_video_id ). "',
       uploaded_file_name = '" .mysql_real_escape_string($uploaded_file_name ). "',
       log_file_path = '" .mysql_real_escape_string($log_file_path). "'";
       $conn->execute($sql);
    }
    
  3. 在我们向数据库添加值之后,我们需要检查之前的转换是否完成,我们准备开始新的转换!创建 convert_queue.php 文件并将其添加到您的 CRON 作业中,假设每 5 分钟一次!

    <?php
    require('path/to/your/config.php');
    require('path/to/your/function.php');
    
    exec("ps ax | grep -v grep | grep ffmpeg", $ffmpeg);
    exec("ps ax | grep -v grep | grep mplayer", $mplayer);
    exec("ps ax | grep -v grep | grep mencoder", $mencoder);
    exec("ps ax | grep -v grep | grep mediainfo", $mediainfo);
    
    $sql = "SELECT * FROM encoding_queue ORDER BY queue_timestamp ASC LIMIT 1";
    $rs = $conn->execute($sql);
    $queue = $rs->getrows();
    if ( $conn->Affected_Rows() == 0 ) {
    die ("Error! There is no records in the database. Nothing to convert. Stopping...");
    }
    if (file_exists($config['VDO_DIR'] . '/' .$queue[0]['uploaded_file_name'])) {
      if(empty($ffmpeg) && empty($mplayer) && empty($mencoder) && empty($mediainfo)) {
         RunInBackground('convert.php', array($queue[0]['uploaded_file_name'], $queue[0]['uploaded_video_id']), $queue[0]['log_file_path']);
    } else {
         die ("Another conversion process is still in progress. Stopping...");
     }
      } else { 
         die ("Error! There is no video file ".$queue[0]['uploaded_file_name']." found. Nothing to convert. Stopping..."); }
     ?>
    
  4. 最后,当我们处理队列中的第一个条目时,我们需要将其从数据库中删除,以便 convert_queue.php 可以开始处理另一个条目。在您清理的某个地方运行它或将其添加到 convert_queue.php,但如果该过程失败,您将无法再次重新启动它:

    $sql = "DELETE FROM encoding_queue WHERE uploaded_video_id = '" .mysql_real_escape_string($uploaded_video_id ). "' LIMIT 1";
    $conn->execute($sql);
    

那么我们得到了什么?如果上传的文件是目前唯一的文件,并且服务器上目前没有更多的转换发生,那么我们开始转换过程!如果有一个视频文件已经被转换,那么我们将有关上传文件的信息放入数据库中,然后我们等待其他文件的转换结束时立即开始转换它。

队列是真正的队列 - 文件正在根据上传时间进行处理!

这是一个 FFMpeg / MPlayer / MEncoder 队列解决方案!

一切顺利,伊利亚

于 2012-07-14T07:52:18.827 回答