1

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

  1. 绕过 nginx/Rails 堆栈直接上传视频到 s3
  2. 使用视频 url 在 Amazon 简单队列服务中创建一个条目
  3. 查看是否有任何 EC2 实例正在运行,如果没有启动一个简单的 ruby​​ 脚本作为启动脚本(我相信亚马逊允许启动脚本低于 6kb)
  4. Ruby 脚本连接到简单队列并运行 ffmpeg 命令对视频进行转码
  5. 脚本查看是否有任何其他队列并运行它们
  6. 当没有更多队列时关闭实例(可能会使其运行一小时,因为 Amazon 对 EC 实例运行的任何部分时间收取全小时费用)

显然以上是基本的,并没有完全使用 EC2。我考虑过使用线程连接到队列并在同一个 EC2 实例上运行新作业或创建其他 EC2 实例,其中启动脚本将运行 ruby​​ 脚本。对于前者,我们需要根据 cpu 使用情况限制同一 EC2 中的作业数量。

后者似乎是一种浪费,但考虑到视频转码是 cpu 密集型的,可能同时两个 ffmpeg 是不可行的。我还考虑过 Amazon 的自动缩放来创建新实例,但使用 Ruby 对我来说似乎更简单、更容易。

  1. 我的问题是有效地做到这一点的最佳方法是什么?
  2. 运行两个 ffmpeg 是否被认为是不好的做法?(假设视频大小平均约为 200mbs。)
  3. 鉴于 Ruby 线程似乎有坏名声,使用它们是否是最佳选择?
  4. 我应该查看 EventMachine 来代替线程吗?

除非必要,否则我不想运行任何 EC2 实例,最大限度地利用实例,但不要让我的用户等待他们的视频转码太久。

基于这篇文章http://stream0.org/2009/10/h264-video-encoding-on-amazons.htmlhttp://stream0.org/2009/10/h264-video-encoding-on-amazons.html 高-CPU,Extra Large Instance似乎是最好的选择。当然,我计划自己做一些测试,但我想在深入研究之前获得一些专家意见。谢谢!

原来这是一篇文章,抱歉太长了。

4

1 回答 1

2

我今天在本地机器上运行了一些测试,以测试多个 ffmpeg 进程的 CPU 使用率。我在 Internet 上找到了以下命令,到目前为止它运行良好,它编码为 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 进程非常稳定,减去几个峰值。至少对于我的机器来说,4 个 ffmpeg 实例似乎是最有效的。

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

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

于 2011-02-15T20:17:01.277 回答