AWS Elastic Transcoderを使ってみました


どちらかというとAzure派です。
こんにちは。masuyamaです。

ひさしぶりにちょっと技術的な話題です。

スマートエデュケーションではAWSを使っています。
我々のような規模の小さい会社が成り立つのは、クラウドサービスがあるおかげと言っても過言ではありません。
しかし、実際使おうとしてみると意外と思い通りに動いてくれなかったり、ドキュメントがなかったりで苦労することも多いです。
今回は Ruby から Elastic Transcoder  のJobを作成して HLS 形式のファイルを出力してみました。

NoName_2015-5-17_18-13-46_No-00

Pipelineの作成

こちらはAWSのコンソールから最初に作っておきます。
input/output の S3 bucket を指定するのですが、HLS 形式に出力する場合には Encryption を指定します。

これを指定するためにはまず、KMS(Key Management Service) で Key を作成しておく必要があります。
さらに KMS で Key の作成する際に “Elastic_Transcoder_Default_Role” が選択可能ですのでこれを選択しておきます。

Pipeline では作成した Kye の ARN を指定します。

NoName_2015-5-17_17-51-36_No-00

Jobの作成

動画の変換 Job は Ruby から作成してみます。


elastictranscoder = Aws::ElasticTranscoder::Client.new(
  access_key_id: accces_key,
  secret_access_key: secret_key,
  region: region,
)

params = {
  :pipeline_id => "111111111111-000000",
  :input => {
    :key => filepath,
  },
  :output => {
    :key => filename,
    :preset_id => "1351620000001-200020", # HLS 1.5M
    :segment_duration => "2.0",
  },
  :output_key_prefix => "streaming/",
  :playlists => [
    {
      :name => "#{filename}_playlist",
      :format => "HLSv3",
      :output_keys => [filename],
      :hls_content_protection => {
        :method => "aes-128",
        :key_storage_policy => "NoStore",
        :license_acquisition_url => keyurl,
      }
    },
  ],
}
result = elastictranscoder.create_job(params)
jobid = result[:job][:id]

こちらは、最低限のところだけ抜き出しています。
サムネイルを作ったり、Wartermarkをつけたり、いろいろなことができます。

pipeline_id:
こちらには前項で登録したpipelineのidを指定してください。

preset_id:
ここではデフォルトで用意されたものの中から使用しています。変換したい動画によって変更してください。
自分で設定を作成することもできます。

hls_content_protection:
暗号化の設定です。Key を保存する設定にしてしまうと、.tsファイルを同じ場所に Key ファイルが生成されてしまいます。
NoStore を指定して、後ほど Job から Key を取り出します。

Keyの取り出しと保存

Key は Job 情報から取り出せるのですが、これがまた意外と面倒でした。


  elastictranscoder = Aws::ElasticTranscoder::Client.new(
    access_key_id:      access_key,
    secret_access_key:  secret_key,
    region:             region,
  )
  kms = Aws::KMS::Client.new(
    access_key_id:      access_key,
    secret_access_key:  secret_key,
    region:             region,
  )
  context = {
    "service" => "elastictranscoder.amazonaws.com",
  }

  job = elastictranscoder.read_job({:id => jobid})
  base64key = job[:job][:playlists][0][:hls_content_protection][:key]
  blobtext = Base64.decode64(base64key )

  decryptedkey = kms.decrypt(
    ciphertext_blob: blobtext,
    encryption_context: context,
  )
  key = decryptedkey[:plaintext]

エラー処理や Job のステータス確認等省いていますので、基本的な動作程度の参考にしてください。
まず、Job が実行されると Job 内に Key が自動的に生成されています。
Key は KMS で encrypt され、さらに base64 encode されていますので、その逆をやってあげます。
decrypt する際に、context  を与えてあげるのを忘れないようにしてください。

取り出した Key は前項の license_acquisition_url で指定した URLでダウンロードできるようにしておきます。

まとめ

さらっと書いていますが、まだまだAWSの情報を検索するスキルが低いようで、ここにたどり着くまでにそれなりに試行錯誤しました。
いろいろと大変ではありますが、自前でサービスを構築するよりはだいぶ楽ですので、これからもクラウドサービスを積極的に使っていきたいと思います。
(そして苦労した点はブログで積極的に公開していきます。)