注目の記事

Amazon Elastic Transcoder メディア変換サービス来た!

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon Elastic Transcoderとは

etrans-001

AET(Amazon Elastic Transcoder)は、映像・音声をユーザーが再生可能なフォーマットに変換するクラウドサービスです。

入出力の形式

重要だと思ったので最初に言いますが、入力形式としてサポートしている動画フォーマットは、3GP, AAC, AVI, FLV, MP4です。出力形式としてサポートしている動画フォーマットは、H.264/AAC/MP4です。音声データは、2-channel AACです。サンプルレートやビットレートは変更可能です。

変換可能な形式(プリセット)一覧

AETが変換可能なメディア形式は以下になります。これらはよくある形式として最初から登録されています。この他にも自分でエンコード形式を定義することも可能です。

  • System preset generic 1080p
  • System preset generic 720p
  • System preset generic 480p 16:9
  • System preset generic 480p 4:3
  • System preset generic 360p 16:9
  • System preset generic 360p 4:3
  • System preset generic 320x240
  • System preset: iPod touch 5G, 4G, iPad 1G, 2G
  • System preset: iPhone 5, iPad 3G, 4G, iPad mini, Samsung Galaxy S2/S3/Tab 2
  • System preset: iPhone 3GS
  • System preset: iPhone 1, 3, iPod classic
  • System preset: Apple TV 2G
  • System preset: Apple TV 3G, Roku HD/2 XD
  • System preset: Facebook, SmugMug, Vimeo, YouTube
  • System preset: Kindle Fire HD
  • System preset: Kindle Fire HD 8.9
  • System preset: Kindle Fire

メディアファイルのアップロード

AETは、S3にアップされたメディア生データをユーザの環境に合わせて鑑賞できるように変換してくれます。ですから、まずはS3にメディアをアップしておいてください。

パイプラインの作成

一連の流れを確認してみましょう。まずはAWS管理コンソールからAmazon Elastic Transcoderを選択します。

etrans-000

AETは、パイプライン、ジョブ、プリセットの3つの部品からできています。

etrans-002

パイプラインの作成時は、入力元となるS3バケットと出力先となるS3バケットを指定します。

etrans-003

このとき、パイプライン内で起こったイベントをSNS通知するかオプション指定することもできます。

etrans-004

作成が完了したら詳細を見てみましょう。

etrans-005

ジョブの作成

続きましてジョブの作成に移ります。パイプライン名を指定した後に、プリセットを指定します。これは、変換形式の指定です。あらかじめたくさん用意されていますので選択しましょう。

etrans-007

進捗の確認

作成したジョブは確認画面から検索することができます。パイプラインIDやステータスから検索することができます。

etrans-006

パイプライン作成時にSNS通知を追加しておけばステータスが変更されたタイミングでSNSにメッセージが飛びます。SNSに購読者としてメールアドレスを登録しておけば以下のようなメッセージが飛んできます。

{"state":"PROGRESSING","jobId":"135942142341086-5d5607","pipelineId":"1234448208018-6eb5e6","errorCode":null,"messageDetails":null}

出来上がり

出来上がり〜♪といきたいところですが、、、、以下のように変換に失敗することもあります。入力メディアの形式に制限があることを忘れていましたw。(ブログの最初に追記しましたw)

etrans-008

色々調べていたら入力メディアのフォーマットが対応外でしたw。そこで、改めて対応しているフォーマットのメディアをアップして再度実行してみましょう。

おそらくうまく行っているはずです。結果は明日!

AWS SDK for Javaから操作する

お決まりパターンですが、Javaから操作するサンプルを作ってみました。

import java.util.List;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;
import com.amazonaws.services.elastictranscoder.AmazonElasticTranscoder;
import com.amazonaws.services.elastictranscoder.AmazonElasticTranscoderClient;
import com.amazonaws.services.elastictranscoder.model.CreatePipelineRequest;
import com.amazonaws.services.elastictranscoder.model.CreatePipelineResult;
import com.amazonaws.services.elastictranscoder.model.Job;
import com.amazonaws.services.elastictranscoder.model.JobInput;
import com.amazonaws.services.elastictranscoder.model.JobOutput;
import com.amazonaws.services.elastictranscoder.model.ListJobsByPipelineRequest;
import com.amazonaws.services.elastictranscoder.model.ListJobsByPipelineResult;
import com.amazonaws.services.elastictranscoder.model.ListPipelinesRequest;
import com.amazonaws.services.elastictranscoder.model.ListPipelinesResult;
import com.amazonaws.services.elastictranscoder.model.ListPresetsRequest;
import com.amazonaws.services.elastictranscoder.model.ListPresetsResult;
import com.amazonaws.services.elastictranscoder.model.Notifications;
import com.amazonaws.services.elastictranscoder.model.Pipeline;
import com.amazonaws.services.elastictranscoder.model.Preset;

public class AmazonElasticTranscoderSample {

	static AmazonElasticTranscoder transCoder;

	private static void init() throws Exception {
		AWSCredentials credentials = new ClasspathPropertiesFileCredentialsProvider().getCredentials();
		transCoder = new AmazonElasticTranscoderClient(credentials);
		transCoder.setEndpoint("https://elastictranscoder.ap-northeast-1.amazonaws.com");
	}

	public static void main(String[] args) throws Exception {
		init();
		
		CreatePipelineRequest createPipelineRequest = new CreatePipelineRequest();
		createPipelineRequest.setName("hogehoge");
		createPipelineRequest.setInputBucket("input.akari7.net");
		createPipelineRequest.setOutputBucket("output.akari7.net");
		Notifications notifications = new Notifications();
		notifications.setWarning("arn:aws:sns:ap-northeast-1:7712XXXXXXXX:topic-sample");
		notifications.setProgressing("arn:aws:sns:ap-northeast-1:7712XXXXXXXX:topic-sample");
		notifications.setError("arn:aws:sns:ap-northeast-1:7712XXXXXXXX:topic-sample");
		notifications.setCompleted("arn:aws:sns:ap-northeast-1:7712XXXXXXXX:topic-sample");
		createPipelineRequest.setNotifications(notifications);
		createPipelineRequest.setRole("arn:aws:iam::7712XXXXXXXX:role/Elastic_Transcoder_Default_Role");
		CreatePipelineResult createPipelineResult = transCoder.createPipeline(createPipelineRequest);
		Pipeline p = createPipelineResult.getPipeline();
		System.out.println("----------New Pipeline----------");
		System.out.println("Id : "+p.getId());
		System.out.println("  Name : "+p.getName());
		System.out.println("  Status : "+p.getStatus());

		ListPipelinesRequest listPipelineRequest = new ListPipelinesRequest();
		ListPipelinesResult listPipelineResult = transCoder.listPipelines(listPipelineRequest);
		List<Pipeline> pipelines = listPipelineResult.getPipelines();
		System.out.println("----------Pipeline List----------");
		for (Pipeline pipeline : pipelines) {
			System.out.println("Id : " + pipeline.getId());
			System.out.println("  Name : " + pipeline.getName());
			System.out.println("  Role : " + pipeline.getRole());
			ListJobsByPipelineRequest listJobsByPipelineRequest = new ListJobsByPipelineRequest();
			listJobsByPipelineRequest.setPipelineId(pipeline.getId());
			ListJobsByPipelineResult listJobsByPipelineResult = transCoder.listJobsByPipeline(listJobsByPipelineRequest);
			List<Job> jobs = listJobsByPipelineResult.getJobs();
			for(Job job : jobs){
				System.out.println("  Id : "+job.getId());
				JobInput jobInput = job.getInput();
				System.out.println("    JobInput");
				System.out.println("      AspectRatio : "+jobInput.getAspectRatio());
				System.out.println("      Container : "+jobInput.getContainer());
				System.out.println("      FrameRate : "+jobInput.getFrameRate());
				System.out.println("      Interlaced : "+jobInput.getInterlaced());
				System.out.println("      Key : "+jobInput.getKey());
				System.out.println("      Resolution : "+jobInput.getResolution());
				JobOutput jobOutput = job.getOutput();
				System.out.println("    JobOutput");
				System.out.println("      Key : "+jobOutput.getKey());
				System.out.println("      PresetId : "+jobOutput.getPresetId());
				System.out.println("      Rotate : "+jobOutput.getRotate());
				System.out.println("      Status : "+jobOutput.getStatus());
				System.out.println("      StatusDetail : "+jobOutput.getStatusDetail());
				System.out.println("      ThumbnailPattern : "+jobOutput.getThumbnailPattern());	
			}
		}

		System.out.println("----------Preset List----------");
		ListPresetsRequest listPresetsRequest = new ListPresetsRequest();
		ListPresetsResult listPresetsResult = transCoder.listPresets(listPresetsRequest);
		List<Preset> presets = listPresetsResult.getPresets();
		for (Preset preset : presets) {
			System.out.println("Id : " + preset.getId());
			System.out.println("  Name : " + preset.getName());
			System.out.println("  Description : " + preset.getDescription());
			System.out.println("  Type : " + preset.getType());
			System.out.println("  Thumbnails : " + preset.getThumbnails());
			System.out.println("  Video : " + preset.getVideo());
			System.out.println("  Audio : " + preset.getAudio());
		}
	}
}

実行結果は以下のような感じです。

----------New Pipeline----------
Id : 1359476482173-42ee2a
  Name : hogehoge
  Status : Active
----------Pipeline List----------
Id : 1359448208018-6eb5e6
  Name : sample1
  Role : arn:aws:iam::7712XXXXXXXX:role/Elastic_Transcoder_Default_Role
  Id : 1359461290399-ac592b
    JobInput
      AspectRatio : auto
      Container : auto
      FrameRate : auto
      Interlaced : auto
      Key : movie.mp4
      Resolution : auto
    JobOutput
      Key : movie.mov
      PresetId : 1351620000000-100030
      Rotate : auto
      Status : Error
      StatusDetail : 9999: Amazon Elastic Transcoder encountered an internal failure.
      ThumbnailPattern : null
  Id : 1359459891086-5d5607
    JobInput
      AspectRatio : auto
      Container : auto
      FrameRate : auto
      Interlaced : auto
      Key : movie.mov
      Resolution : auto
    JobOutput
      Key : movie.mpg
      PresetId : 1351620000000-100030
      Rotate : auto
      Status : Error
      StatusDetail : 9999: Amazon Elastic Transcoder encountered an internal failure.
      ThumbnailPattern : null
  Id : 1359449690967-43c78b
    JobInput
      AspectRatio : auto
      Container : auto
      FrameRate : auto
      Interlaced : auto
      Key : movie.mov
      Resolution : auto
    JobOutput
      Key : movie.mpg
      PresetId : 1351620000000-100070
      Rotate : auto
      Status : Error
      StatusDetail : 9999: Amazon Elastic Transcoder encountered an internal failure.
      ThumbnailPattern : null
Id : 1359475647523-80c6a2
  Name : hogehoge
  Role : arn:aws:iam::7712XXXXXXXX:role/Elastic_Transcoder_Default_Role
Id : 1359476482173-42ee2a
  Name : hogehoge
  Role : arn:aws:iam::7712XXXXXXXX:role/Elastic_Transcoder_Default_Role
----------Preset List----------
Id : 1351620000000-000001
  Name : System preset: Generic 1080p
  Description : System preset generic 1080p
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=4}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 5400, FrameRate: 29.97, Resolution: 1920x1080, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 44100, BitRate: 160, Channels: 2, }
Id : 1351620000000-000010
  Name : System preset: Generic 720p
  Description : System preset generic 720p
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 2400, FrameRate: 29.97, Resolution: 1280x720, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 44100, BitRate: 160, Channels: 2, }
Id : 1351620000000-000020
  Name : System preset: Generic 480p 16:9
  Description : System preset generic 480p 16:9
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 1200, FrameRate: 29.97, Resolution: 854x480, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 44100, BitRate: 128, Channels: 2, }
Id : 1351620000000-000030
  Name : System preset: Generic 480p 4:3
  Description : System preset generic 480p 4:3
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x144, AspectRatio: 4:3, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 900, FrameRate: 29.97, Resolution: 640x480, AspectRatio: 4:3, }
  Audio : {Codec: AAC, SampleRate: 44100, BitRate: 128, Channels: 2, }
Id : 1351620000000-000040
  Name : System preset: Generic 360p 16:9
  Description : System preset generic 360p 16:9
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 720, FrameRate: 29.97, Resolution: 640x360, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 44100, BitRate: 128, Channels: 2, }
Id : 1351620000000-000050
  Name : System preset: Generic 360p 4:3
  Description : System preset generic 360p 4:3
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x144, AspectRatio: 4:3, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 600, FrameRate: 29.97, Resolution: 480x360, AspectRatio: 4:3, }
  Audio : {Codec: AAC, SampleRate: 44100, BitRate: 128, Channels: 2, }
Id : 1351620000000-000060
  Name : System preset: Generic 320x240
  Description : System preset generic 320x240
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x144, AspectRatio: 4:3, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=1.3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 300, FrameRate: 15, Resolution: 320x240, AspectRatio: 4:3, }
  Audio : {Codec: AAC, SampleRate: 22050, BitRate: 64, Channels: 2, }
Id : 1351620000000-100010
  Name : System preset: iPhone4
  Description : System preset: iPod touch 5G, 4G, iPad 1G, 2G
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 2200, FrameRate: 30, Resolution: 1280x720, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, }
Id : 1351620000000-100020
  Name : System preset: iPhone4S
  Description : System preset: iPhone 5, iPad 3G, 4G, iPad mini, Samsung Galaxy S2/S3/Tab 2
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=high, Level=4.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 5000, FrameRate: 30, Resolution: 1920x1080, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, }
Id : 1351620000000-100030
  Name : System preset: iPhone3GS
  Description : System preset: iPhone 3GS
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x144, AspectRatio: 4:3, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 600, FrameRate: 30, Resolution: 640x480, AspectRatio: 4:3, }
  Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, }
Id : 1351620000000-100040
  Name : System preset: iPod Touch
  Description : System preset: iPhone 1, 3, iPod classic
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x144, AspectRatio: 4:3, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 1500, FrameRate: 30, Resolution: 640x480, AspectRatio: 4:3, }
  Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, }
Id : 1351620000000-100050
  Name : System preset: Apple TV 2G
  Description : System preset: Apple TV 2G
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 5000, FrameRate: 30, Resolution: 1280x720, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, }
Id : 1351620000000-100060
  Name : System preset: Apple TV 3G
  Description : System preset: Apple TV 3G, Roku HD/2 XD
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=high, Level=4}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 5000, FrameRate: 30, Resolution: 1920x1080, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, }
Id : 1351620000000-100070
  Name : System preset: Web
  Description : System preset: Facebook, SmugMug, Vimeo, YouTube
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 2200, FrameRate: 30, Resolution: 1280x720, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 44100, BitRate: 160, Channels: 2, }
Id : 1351620000000-100080
  Name : System preset: KindleFireHD
  Description : System preset: Kindle Fire HD
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=4}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 2200, FrameRate: 30, Resolution: 1280x720, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, }
Id : 1351620000000-100090
  Name : System preset: KindleFireHD8.9
  Description : System preset: Kindle Fire HD 8.9
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=4}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 5400, FrameRate: 30, Resolution: 1920x1080, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, }
Id : 1351620000000-100100
  Name : System preset: KindleFire
  Description : System preset: Kindle Fire
  Type : System
  Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, }
  Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 1600, FrameRate: 30, Resolution: 1024x576, AspectRatio: 16:9, }
  Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, }

まとめ

エンコーディングという大量のリソースを使う地味な仕事をクラウドでちゃちゃっとやってくれるAmazon Elastic Transcoderによって、ユーザはよりビジネスにフォーカスしたアプリケーションの開発ができるようになりますね!!今のところ入力フォーマットに制限がありますが、スマホ時代には十分かなと思います!

参考資料

Getting Started with Elastic Transcoder

What is Amazon Elastic Transcoder?

Limits on the Number of Elastic Transcoder Entities