1

私は現在、ユーザーがアップロードしたビデオを linode サーバーにトランスコードし、s3 を使用してそれらを保存していますが、私は楽観主義者なので、トランスコーディングを Amazon EC2 に移動して、必要に応じてスケールアップし、それを使用して経験を積みたいと考えています。これまでの私のワークフローは次のとおりです。

  1. nginx/Rails スタックをバイパスして、動画を s3 に直接アップロードする
  2. ビデオ URL を使用して Amazon シンプル キュー サービスにエントリを作成する
  3. EC2 のインスタンスが実行されているかどうかを確認します。そうでない場合は、起動スクリプトとして単純な ruby​​ スクリプトを使用して起動します (Amazon は 6kb 未満の起動スクリプトを許可していると思います)。
  4. Ruby スクリプトは単純なキューに接続し、ffmpeg コマンドを実行してビデオをトランスコードします
  5. スクリプトは、追加のキューがあるかどうかを確認して実行します
  6. キューがなくなったらインスタンスをシャットダウンします (EC インスタンスが実行されている時間の任意の部分に対して Amazon が 1 時間分の料金を請求するため、1 時間実行する可能性があります)。

明らかに、上記は基本的なものであり、EC2 を完全には使用していません。スレッドを使用してキューに接続し、同じ EC2 インスタンスで新しいジョブを実行するか、起動スクリプトが ruby​​ スクリプトを実行する追加の EC2 インスタンスを作成することを考えました。前者では、CPU 使用率に基づいて同じ EC2 内のジョブ数を制限する必要があります。

後者は無駄に思えますが、ビデオ トランスコーディングは CPU を集中的に使用するため、2 つの ffmpeg を同時に実行するのは現実的ではありません。新しいインスタンスを作成するために Amazon の自動スケーリングについても考えましたが、Ruby を使用する方が簡単で簡単に思えます。

  1. 私の質問は、これを効率的に行うための最良の方法は何ですか?
  2. 2 つの ffmpeg を実行することは悪い習慣と見なされますか? (ビデオ サイズが平均約 200 mbs になると仮定しましょう。)
  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、エクストラ ラージ インスタンスが最適なオプションのようです。もちろん、私自身のテストをいくつか行う予定ですが、飛び込む前に専門家の意見を聞きたかったのです。ありがとう!

エッセイになってしまいました、長文失礼しました。

4

1 に答える 1

2

今日、ローカルマシンでいくつかのテストを実行して、複数のffmpegプロセスでCPU使用率をテストしました。私はインターネットで次のコマンドを見つけました、そしてこれまでのところそれはきちんと機能します、それはflvにエンコードし、品質の顕著な違いなしにファイルサイズを減らします。私はffmpegについてほとんど何も知らないので、おそらくコマンドは完全にがらくたです(そうである場合は私に知らせてください)。1つの問題は、ffmpegのスレッドをサポートしていないことですが、それはコーデックの問題かもしれないと思います。

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

top -b -d 0.5CPU使用率を測定するために0.5秒間隔で使用し、関連grep Cpu情報を取得しました。ファイルのサイズは約150MBで、同じ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

データに基づくと、ビデオを1つずつ変換することは、リソースの使用量が少ない場合に大きくなります。また、ffmpegプロセスは非常に安定しており、カップルのスパイクはありません。少なくとも私のマシンでは、ffmpegの4つのインスタンスが最も効率的であるようです。

システムコマンドを使用Threadまたは使用して、 2つのffmpegプロセスを並行して実行するのに問題があるようです。fork

誰かがこれについて何か考えを持っていますか?特に、Rubyスクリプトを使用して2つのffmpegプロセスを実行する方法は?

于 2011-02-15T20:17:01.277 に答える