需要帮助设计使用EC2的视频转码处理?

时间:2011-02-14 19:25:02

标签: ruby-on-rails amazon-ec2 video-processing video-encoding eventmachine

我目前正在使用linode服务器转码用户上传的视频,并使用s3来存储它们,但是,作为乐观主义者,我想将转码转移到Amazon EC2,以便在必要时进行扩展,以获得使用它。到目前为止,这是我的工作流程:

  1. 直接将视频上传到s3,绕过nginx / Rails堆栈
  2. 使用视频网址
  3. 在Amazon简单队列服务中创建一个条目
  4. 查看EC2的任何实例是否正在运行,如果没有以简单的ruby脚本作为启动脚本启动(我相信亚马逊允许6kb以下的启动脚本)
  5. Ruby脚本连接到简单队列并运行ffmpeg命令以转码视频
  6. 脚本查看是否有任何其他队列并运行它们
  7. 当没有更多队列时关闭实例(可能会让它运行整整一个小时,因为亚马逊对小时EC实例运行的任何时间段的整个小时收费)
  8. 显然以上是基本的,并没有将EC2用于其全部目的。我曾考虑使用线程连接到队列并在同一EC2实例上运行新作业或创建其他EC2实例,其中启动脚本将运行ruby脚本。对于前者,我们需要根据CPU使用情况限制同一EC2中的作业数量。

    后者似乎是浪费,但鉴于视频转码是cpu密集型,可能同时两个ffmpegs是不可行的。我也考虑过亚马逊的自动扩展来创建新实例,但使用Ruby对我来说似乎更简单,更容易。

    1. 我的问题是,有效执行此操作的最佳方式是什么?
    2. 运行两个ffmpegs被认为是不好的做法? (我们假设视频大小平均约为200mb。)
    3. 鉴于他们似乎有错误的名字,使用Ruby线程是否最佳?
    4. 我应该调查EventMachine来代替线程吗?
    5. 除非必要,否则我不想运行任何EC2实例,从实例中获取最大数量,但不要让我的用户等待太长时间才能对其视频进行转码。

      基于这篇文章http://stream0.org/2009/10/h264-video-encoding-on-amazons.htmlhttp://stream0.org/2009/10/h264-video-encoding-on-amazons.html 高CPU,超大型实例似乎是最佳选择。当然我打算做一些自己的测试,但在潜入之前我想得到一些专家的意见。谢谢!

      这结果是一篇文章,对不起。

1 个答案:

答案 0 :(得分:2)

我今天在本地计算机上运行了一些测试来测试多个ffmpeg进程的CPU使用情况。我在互联网上找到了以下命令,到目前为止它工作得体,它编码为flv,减少文件大小而没有明显的质量差异。我对ffmpeg几乎一无所知,所以也许命令是完全废话(如果是的话请告诉我)。一个问题是它不支持ffmpeg中的线程,但我认为这可能是编解码器的事情。

ffmpeg -i explanation-ace-2-3.mp4 -ab 96k -ar 22050 -qscale 6 output3.flv

我以半秒为间隔使用top -b -d 0.5来衡量CPU使用率,并grep Cpu获取相关信息。文件大小约为150mbs,并使用相同的ffmpeg命令进行编码。我让这个过程运行一点,然后开始一个新的过程,这是我的结果:

1 FFMPEG | **0.84mbs/sec**
- 306.31 secs - 5:06 

Cpu(s): 23.6%us,  2.9%sy, 73.6%id  
Cpu(s): 23.7%us,  2.4%sy, 73.9%id  
Cpu(s): 23.6%us,  1.9%sy, 74.5%id  

2 FFMPEG | 1.6 mbs/sec
- 319.25 secs - 5:18
- 319.04 secs - 5:18

Cpu(s): 45.9%us,  4.4%sy, 49.8%id  
Cpu(s): 45.0%us,  5.7%sy, 49.3%id  
Cpu(s): 42.9%us,  8.3%sy, 48.8%id  

3 FFMPEGs | **2.23 mbs/sec**
- 344.72 secs - 5:44
- 342.12 secs - 5:42
- 340.39 secs - 5:40

Cpu(s): 68.8%us,  7.3%sy, 23.9%id  
Cpu(s): 70.9%us,  6.9%sy, 22.2%id  
Cpu(s): 66.0%us,  9.9%sy, 24.1%id  

4 FFMPEGs | **2.69 mbs/sec**
- 379.36 secs - 6.32
- 379.70 secs - 6.33
- 380.89 secs - 6.35
- 378.14 secs - 6.30

Cpu(s): 88.2%us, 11.8%sy,  0.0%id  
Cpu(s): 87.7%us, 12.3%sy,  0.0%id  
Cpu(s): 89.7%us, 10.3%sy,  0.0%id

5 FFMPEGs | **2.61 mbs/sec**
- 459.79 secs - 7.66
- 469.03 secs - 7.82
- 448.15 secs - 7.47
- 458.62 secs - 7.64
- 489.47 secs - 8.16

Cpu(s): 93.1%us,  6.4%sy,  0.0%id
Cpu(s): 88.7%us, 11.3%sy,  0.0%id
Cpu(s): 92.2%us,  7.8%sy,  0.0%id

根据这些数据,逐个转换视频的资源使用率很低,而且ffmpeg进程相当稳定,减去几个峰值。 ffmpeg的4个实例,至少对我的机器来说,似乎是最有效的。

我似乎无法使用系统命令使用Threadfork并行运行两个ffmpeg进程。

有没有人对此有任何想法?特别是如何使用Ruby脚本运行两个ffmpeg进程?