금일은 Elastic Transcoder 포스팅합니다.
Elastic Transcoder는 미디어 파일을 인코딩(파일 포맷, 해상도, 패킷타이징, 썸네일, Watermark 등) 서비스입니다.
현재 Seoul Region은 지원되지 않으며, 업데이트 우선 순위도 낮은 것으로 알고 있습니다. 따라서 Tokyo Region을 써야 합니다. (국내에서 사용하고 싶으면 Input은 Tokyo Region S3, Ouput은 Seoul Region S3로 하면 될 듯 하나..굳이..)
또한 vod 파일에 한해서 지원되며, Live 인코딩은 지원되지 않습니다.
S3 Event, Lambda와 연동하면 서버 없이 인코딩 시스템을 구축할 수 있습니다. (Lambda 포스팅 재탕이네요....Lambda 내용은 좀 배제했습니다.)
테스트 시나리오는 다음과 같습니다.
avi 등의 포맷과 고화질 미디어 파일이 업로드 되면, mp4 포맷, 해상도 1080p으로 트랜스코딩 되어 플레이어 없이 웹에서 바로 서비스할 수 있도록 하겠습니다.
일단 Tokyo Region에서 S3 Bucket을 생성합니다.
IAM에서 아래 Policy가 있는 Role을 생성해줍니다. (SNS 등 연동이 필요하면 해당 내용도 추가)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:Put*", "s3:Get*", "s3:*MultipartUpload*", "s3:Delete*" ], "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "Stmt1441234334958", "Action": [ "elastictranscoder:CreateJob" ], "Effect": "Allow", "Resource": "*" } ] } |
Role에 해당 Policy를 Inline Policies로 등록합니다.
Elastic Transcoder 페이지로 이동하면 Pipelines, Jobs, Presets 항목을 볼 수 있습니다.
Pipelines에서는 트랜스코딩할 파일의 Input, Output 및 SNS Topic 등을 설정합니다.
Jobs에서는 트랜스코딩 설정을 할 수 있습니다. (Preset 인코딩 포맷, 해상도 등, Watermark, Playlist, Metadata)
Presets에서는 인코딩 포맷을 커스터마이징 하게 만들 수 있습니다.
work flow는 Pipeline을 한 번 생성한 뒤, 매번 Jobs을 생성해서 트랜스코딩 합니다.
Lambda를 이용하면, S3 Event Trigger를 받아 Job을 자동 생성해서 트랜스코딩합니다.
Pipeline을 생성합니다. IAM Role에는 이전에 생성한 Role을 매핑합니다. 본 테스트에서 SNS 설정은 하지 않았습니다.
Jobs을 생성해봅니다. 기본적으로 어떻게 동작하는지 확인해봅시다. 사전에 Input Bucket에는 test.avi 파일이 업로드 되어 있어야 합니다.
몇초간 기다리면 아래와 같이 Complete 되었다는 Response를 받을 수 있습니다.
S3에서 확인해봅니다. bucket에 leedoing-transcoding 한 depth가 더 들어갔네요. Jobs의 Output key Prefix를 비워뒀으면 바로 leedoing-transcoding 버킷 밑에 생성됩니다.
일단 동작 방식은 확인했으니, Lambda와 javascript sdk를 활용해봅니다.
(참고 - http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElasticTranscoder.html#createJob-property)
Lambda를 이용해서 createjob을 만들어야 합니다. Parameter가 무지 많습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | var params = { Input: { /* required */ AspectRatio: 'STRING_VALUE', Container: 'STRING_VALUE', DetectedProperties: { DurationMillis: 0, FileSize: 0, FrameRate: 'STRING_VALUE', Height: 0, Width: 0 }, Encryption: { InitializationVector: 'STRING_VALUE', Key: 'STRING_VALUE', KeyMd5: 'STRING_VALUE', Mode: 'STRING_VALUE' }, FrameRate: 'STRING_VALUE', ... UserMetadata: { someKey: 'STRING_VALUE', /* anotherKey: ... */ } }; elastictranscoder.createJob(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response }) |
구글링을 통해 간단히 필요한 Parameter를 확인했습니다. Lambda 생성 가이드는 생략합니다.
(참고 - https://aws.amazon.com/ko/blogs/korea/category/aws-lambda/)
ElastisTranscoder 생성과 같이 이전 만든 Role을 매핑해서 생성합니다.
watermark도 미리 input 버킷에 설정하시기 바랍니다.
Bucket, Key, Pipeline ID, PresetId, watermark 만 수정해서 사용하면 바로 사용할 수 있습니다.
동일한 이름의 파일을 업로드하면 ElasticTranscoder에서 덮어쓰기가 되지 않는 것 같습니다. 동일한 이름의 파일을 받으면 먼저 해당 파일을 버킷에서 삭제한 뒤에 트랜스코딩합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | var aws = require('aws-sdk'); var elastictranscoder = new aws.ElasticTranscoder(); var s3 = new aws.S3(); exports.handler = function(event, context) { console.log('Received event:', JSON.stringify(event, null, 2)); // Get the object from the event and show its content type var key = event.Records[0].s3.object.key; var s3Params = { Bucket: 'leedoing-transcoding', //output bucket name Key: key.split('.')[0]+'.mp4' //object name }; var etParams = { Input: { Key: key }, PipelineId: '1464587330316-a37yxe', //pipeline ID Outputs: [ { Key: key.split('.')[0]+'.mp4', PresetId: '1351620000001-000001', //transcoding presetID(ex. generic1080p) Watermarks: [ { InputKey: 'watermark.png', //watermark key PresetWatermarkId: 'TopRight' //which watermark goes where } ] } ] }; s3.deleteObject(s3Params, function(err, data){ //async(deleteobject, transcoding) if(err){ console.log('s3 object delete failed'); console.log(err, err.stack); context.fail(); }else{ console.log('s3 objcet delete succceed'); elastictranscoder.createJob(etParams, function(err, data) { if(err){ console.log('transcoding failed'); console.log(err, err.stack); // an error occurred context.fail(); }else{ console.log('transcoding succeed') context.succeed('transcoding succeed'); } }); } }); }; |
테스트 전 다시 S3로 돌아가, Properties 아래 Events 항목에 생성한 Lambda ARN을 입력합니다. HTTP Put, Post, Multipart upload Method가 발생되면 Lambda로 Event trigger가 이루어집니다.
이제 테스트해봅니다. 테스트 파일은 크기 480KB의 test.avi입니다.
input 버킷에 업로드합니다.
output 버킷에 test.mp4 파일이 생성되었습니다. watermark도 잘 들어가있네요.
트랜스코딩에 대한 내역은 Elastic Transcoder 콘솔 jobs에서 확인할 수 있습니다.
세부 사항은 돋보기를 클릭하면 보입니다.
이제 인코딩 서버 필요없이 인코딩과 워터마크, 썸네일 이미지 추출을 할 수 있게 되었습니다. 모든 것은 AWS에서 Managed 됩니다.
다만 비용이 저렴한 편은 아니라서 꼭 확인을 하시기 바랍니다. (https://aws.amazon.com/ko/elastictranscoder/)
추가로 Lambda 로그는 Cloudwatch Logs에서 확인하실 수 있습니다.
감사합니다.
'Media Services > ElasticTranscoder' 카테고리의 다른 글
AWS Elastic Trancoder를 활용하여 HLS 서비스 하기 (0) | 2016.07.20 |
---|