Zendframework + ffmpeg + gearman + amazon =ビデオエンコーダサービス

ビデオを変換してクラウドストレージに保存するためのWebサービスを作成した経験をhabrasocietyと共有したいと思います。 すぐに予約すると、このサービスは1つのヨーロッパの企業が内部使用するために作成され、6か月以上運用されています。 会社の分野の1つはWebTv製品です。 新しいサイトごとにビデオ変換の構造を展開することは非常に問題であり、これらのプロセスはサーバーを大きく妨げることがよくありました。

次の要件を満たすサービスを作成することが決定されました。





サービスとの統合の最も単純なスキーム。



最も使用されるスキームは、POSTビデオアップロードです。 クライアントサイトでは、新しいビデオを追加するためのフォームにフラッシュローダーが埋め込まれ、認証データとともにファイルがビデオサービスに直ちに送信されます。 以下の図は、すべてのステップの詳細を示しています。







サービス側でのデータとビデオの確認。





認証

なぜなら 承認のためのログインとパスワードはhtmlコードで利用できますが、これは良くありません。何かを考え出す必要がありました。 解決策は、ライフタイムが制限されたワンタイムパスワードと2段階認証システムを使用することでした。 クライアントサービスはパスワードを生成し、それをデータベースに保存します(生成時間とトークンが使用される/使用されない)。 要求を受信した後、ビデオサービスは所定のURLでクライアントサーバーをノックし、パスワードの関連性の確認を受信します。



ビデオチェック

当然、ダウンロードしたファイルが実際にビデオファイルであると盲目的に信じることはできません。

ffmpeg_movieクラスを使用して、ファイルを使用できないというエラーをクライアントサーバーに返すことができなかった場合、ビデオファイルに関する情報を見つけようとします。



ギアマン



実際には、タスクはリクエストをデータベースに保存した後にビデオの変換を開始することでした。 当然のことながら、古き良きcronは、1分間に1回の順次実行ではうまく適合しません。 その前に、私はすでにGearmanを使用していたので、このツールを選択しました。 実際、私は彼といじくりまわさなければなりませんでした。最初は何らかの理由で、空白の範囲で、私は本来の仕事をしたくありませんでした。

function converter() { //   } $worker = new GearmanWorker(); $worker->addFunction("convert", "converter"); // ..
      
      







労働者は常に-1を返し、死亡しました。 以前のプロジェクトでは少し違った仕事をしたことを思い出しました。 そして彼はGearmanWorkerを継承し、すべてのタイプのワーカーのベースレイヤーを作成しました。



  class App_Model_Worker_Abstract extends GearmanWorker { public function __construct($gearman) { parent::__construct(); if (!$this->addServer($gearman['host'], $gearman['port'])) { throw new Exception("Can't connect to Gearman"); } } public function work() { while (parent::work()); return true; } }
      
      







そして、私はすでに必要な労働者を集めました:



  //  class App_Model_Worker_Converter extends App_Model_Worker_Abstract { public function __construct($gearman) { parent::__construct($gearman); //    } public function action($job) { $fileId = $job->workload(); $file = $this->_modelFileResponse->getPrepareToConvertFile($fileId); //  . } } //,       class App_Model_Worker_SendResponse extends App_Model_Worker_Abstract { public function __construct($gearman) { parent::__construct($gearman); } public function action($job) { $responseId = $job->workload(); //   . } }
      
      







次に、別の不愉快なことが出てきました。DBへの接続は一定時間後に閉じられたので、変換プロセスを開始する前に接続を閉じることにしました。



  $model->getAdapter()->closeConnection();
      
      







統計によると、通常は1時間あたり最大10件のリクエストを処理するには、3〜4人のワーカーで十分です。 Gearmanについて詳しくは、Gearman.orgをご覧ください。



Ffmpeg



この「果物」で、私は多くの眠れない夜を過ごします。 最初は、すべてが些細なことでした。サイズ変更、ビットレートなど、標準的なリクエストをデバッグ済みでした-ここではすべてが些細なことです。 最もおもしろいのは、サイズ変更と回転を行い、マスクとパディングを1回のパスで追加する必要があったときに始まりました。 Vfilters助けになりましたが、比較的最近追加されました。 すべての魅力は、一貫してフィルターを適用できることです。 たとえば、最初に回転、サイズ変更、パディングを追加、透かしを掛けます。 私のサービスでの典型的なffmpegコマンドは次のとおりです。



/usr/local/bin/ffmpeg -i "/home/encoderws/public_html/data/files/requests/example-test-5c2a1c8a2e9e540690ba05670a526872_d917a8705cade8efdd87008df20ef19c" -acodec libfaac -vcodec mpeg4 -b 400k -ar 44100 -f mp4 -ab 96k -ac 2 -vf "[in] rotate=90 [rt0], [rt0] scale=203:360 [sc0], [sc0] pad=640:360:219 [pd0], [pd0] scale=640:360 [sc1], movie=0:png:/home/encoderws/public_html/data/files/watermarks/watermark.png [wm], [sc1] [wm] overlay=0:0:1 [out]" -y '/home/encoderws/public_html/data/files/responses/example-test-5c2a1c8a2e9e540690ba05670a526872_d917a8705cade8efdd87008df20ef19c.mp4









なぜなら 各リクエストは2つのflv + mp4ビデオの作成を必要とするため、作業の最後にデータが同期され、作業が後で完了したワーカーは、完成したデータをAmazonにダウンロードするタスクを並べます。 変換中にエラーが発生した場合は、サーバーに通知してください。



アマゾン



別の種類のGearmanワーカーは、Amazon APIを操作するための標準Zendライブラリを使用して、完成したデータをAmazon S3にアップロードしています。

一般に、過去1年間にAmazonが何度か動揺したことを言いたいと思います。たとえば、ヨーロッパのマネージャーが私に彼が前でビデオを再生しないと書いて、私は彼にこのように書きます動作しません。 その後、別のAmazonデータセンターに目を向けました。 また、大きなビデオのダウンロードに問題があり、月に1回程度、一部のビデオがロードされず、Amazonサーバーが何らかの聞こえないエラーコードを返します。



Amazon S3の詳細については、 Amazon Simple Storageをご覧ください。



その他のグッズ



オンデマンドサービスは、ビデオに透かしをかけたり、ビデオを回転させたり、指定されたパラメーターに従って正しくサイズ変更したり、空のスペースを黒で埋めたりすることができます。 これを行うには、最新バージョンのffmpegに付属しているvfiltersを使用します。



ftp、imap、amazon s3ストレージからビデオを収集して変換し、サーバーに通知することができます(ただし、これらの方法はほとんど使用されません)。



実際、IMAPについて不思議なことは、MMS経由で送信されたビデオを収集することです。 実装の詳細には触れませんでした。私のビジネスは、IMAPプロトコルを使用してメールにアクセスし、新しいメッセージを見つけて、そこからすべてのビデオファイルを収集して処理することでした。



そして今、会社は別の利点について考えています。 Asteriksを固定すると、たとえば、クライアントが3Gをサポートする電話からビデオコールを発信し、ビデオメッセージを残します。Asteriksを介して、このことは特別なパパに入ります。 5分ごとに、ftpのビデオサービスが新しいものを見つけて処理し、使用可能なビデオをクライアントのサーバーに返します。



過去3か月間、サーバーは安定して動作しており、クラッシュすることはありませんでした。 半年間、4000件を超えるリクエストが処理されました。



意見、コメント、建設的な批判を聞くのは興味深い。



All Articles