【问题标题】:FFMpeg + Beanstalk: How to pass the processes to it or achieve the same result without using BeanstalkFFMpeg + Beanstalk:如何在不使用 Beanstalk 的情况下将进程传递给它或达到相同的结果
【发布时间】:2012-07-13 16:39:22
【问题描述】:

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

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

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

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

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

如果您认为使用 Beanstalk 之外的其他东西更好地满足我的需求,并且您知道如何实现它,我仍然很乐意看到它!

提前致谢,
伊利亚

【问题讨论】:

    标签: php ffmpeg task-queue beanstalkd


    【解决方案1】:

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

    【讨论】:

    • 您认为使用 db queue 比使用 Beanstalk 或 Resque 更好?
    • 因为听起来你的问题的一部分是控制有多少 Beanstalk/etc 的实例正在运行。这就是为什么我建议一种单独的转换机制来维护一个实例。我不知道 BeanStalk 或 Resque,但听起来你资源有限。
    【解决方案2】:

    基于 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 队列解决方案!

    一切顺利, 伊利亚

    【讨论】:

      猜你喜欢
      • 2020-07-29
      • 1970-01-01
      • 2012-01-14
      • 2017-12-04
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      相关资源
      最近更新 更多