この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Amazon Elastic Transcoderとは
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を選択します。
AETは、パイプライン、ジョブ、プリセットの3つの部品からできています。
パイプラインの作成時は、入力元となるS3バケットと出力先となるS3バケットを指定します。
このとき、パイプライン内で起こったイベントをSNS通知するかオプション指定することもできます。
作成が完了したら詳細を見てみましょう。
ジョブの作成
続きましてジョブの作成に移ります。パイプライン名を指定した後に、プリセットを指定します。これは、変換形式の指定です。あらかじめたくさん用意されていますので選択しましょう。
進捗の確認
作成したジョブは確認画面から検索することができます。パイプラインIDやステータスから検索することができます。
パイプライン作成時にSNS通知を追加しておけばステータスが変更されたタイミングでSNSにメッセージが飛びます。SNSに購読者としてメールアドレスを登録しておけば以下のようなメッセージが飛んできます。
{"state":"PROGRESSING","jobId":"135942142341086-5d5607","pipelineId":"1234448208018-6eb5e6","errorCode":null,"messageDetails":null}
出来上がり
出来上がり〜♪といきたいところですが、、、、以下のように変換に失敗することもあります。入力メディアの形式に制限があることを忘れていましたw。(ブログの最初に追記しましたw)
色々調べていたら入力メディアのフォーマットが対応外でした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