ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [AWS] AWS MediaConvert Jobtemplate Kotlin SDK 적용
    AWS 2022. 12. 25. 00:01

    [1] [AWS] MediaConvert란? + 튜토리얼

    [2] [AWS] AWS MediaConvert createJob Kotlin SDK 적용

    [3] [AWS] AWS MediaConvert Jobtemplate Kotlin SDK 적용

     

    개요

    이전에 MediaConvert createJob Kotlin SDK 적용까지 해서 job이 생성되는 것까지 확인했습니다.

    이제 DRM을 추가로 적용해보고 createJob을 하기위해 너무 많은 옵션이 필요하기 때문에 Jobtemplate을 통해 job을 생성해보고자 합니다.

     

    DRM 도입

    "mediaconvert kotlin sdk drm" 다음과 같은 검색을 해봐도 자료가 나오지 않습니다.

     

    MediaConvert Job의 detail page에서 View JSON을 보고 힌트를 얻어서 작성하였습니다.

     

    그림 1

    [그림 1]은 Job List들을 보여줍니다.

    여기서 하나의 Job을 클릭하면 detail page로 이동합니다.

     

    그림 2

    [그림 2]는 하나의 Job에 대한 detail page입니다.

    여기서 View JSON을 클릭하면 설정들을 볼 수 있습니다.

    그림 3

    [그림 3]은 View JSON을 클릭한 후 보여지는 JSON입니다.

    옵션에 대한 정보들이 담겨있습니다.

     

    이와 같이 Console에서 DRM을 적용한 후 Job을 생성해보면 JSON상세보기를 하면 다음과 같이 표시됩니다.

          "OutputGroupSettings": {
              "Type": "DASH_ISO_GROUP_SETTINGS",
              "DashIsoGroupSettings": {
                "SegmentLength": 30,
                "Destination": "s3://your_bucket/path/v3/",
                "Encryption": {
                  "SpekeKeyProvider": {
                    "ResourceId": "your Resource Id",
                    "SystemIds": [
                      "your System Ids1",
                      "your System Ids2"
                    ],
                    "Url": "your DRM URL with Token"
                  }
                },
                "FragmentLength": 2
              }
            }

     

    그림 4

    위의 JSON과 [그림 4]는 매우 닮아보입니다.

    이를 통해 hlsGroupSettings에 Encryption을 넣어주면 될 것으로 보입니다.

     

    minSegmentLength = 1 밑에 다음과 같이 추가하면 drm이 적용됩니다.

    encryption = HlsEncryptionSettings{
    	type = HlsKeyProviderType.Speke
    	spekeKeyProvider = SpekeKeyProvider{
    		resourceId = "your resource Id"
    		systemIds = listOf("your system id1","your system id2")
    		url = "drm url with token"
    	}
    }

     

    JobTemplate

    옵션이 너무 많기 때문에 JobTemplate를 통해 Job을 생성해보고자 합니다.

     

    JobTemplate이란?

    매번 Job옵션을 주지 않고 미리 설정을 저장해놓고 template을 통해 사용할 수 있습니다.

     

    JobTemplate 만들기

    그림 5

    [그림 5]의 작업 템플릿을 클릭합니다.

     

    그림 6

    [그림 6]의 템플릿 생성을 클릭합니다.

    그림 7

    [그림 7]처럼 작업 템플릿의 이름을 설정합니다(선택)

    그림 8

    출력 그룹 추가를 선택하고 [그림 8]처럼 원하는 출력 그룹(현재는 DASH ISO)을 선택합니다.

     

    그림 9

    transcoding이후 파일의 output 경로를 지정합니다.

     

     

    그림 10

    이후 [그림 10]처럼 비디오에 대해 프리셋을 지정해주었습니다.

    그림 11

    이후 [그림 11]처럼 오디오에 대해 프리셋을 지정해주었습니다.

    그림12

    결과로 출력 그룹 쪽을 보시면 [그림 12]를 볼 수 있습니다.

     

    이제 작업 템플릿을 생성합니다.

     

    그림 13

    [그림 13] 참고 , 작업 템플릿이 성공적으로 생성되었고 작업 템플릿 id를 확인하기 위해 작업을 생성합니다.

     

    그림 14

    [그림 14]처럼 입력 파일 URL을 입력합니다.

     

     

    그림 15

    작업 설정 -> AWS 통합으로 이동하여 [그림 15]처럼 기존 서비스 역할 사용 -> IAM을 지정해줍니다.

     

    그림 16

    작업 -> 작업 템플릿으로 생성한 작업 클릭 -> JSON 보기로 이동하면 JobTemplate의 id를 알 수 있고 JSON이 어떻게 구성되었는지 확인할 수 있습니다.

     

    Jobtemplate을 활용한 SDK

    @Service
    class JobServiceWithTemplate {
        fun createMediaConvertJob() : String{
            val usage = """
            Usage
                <mcRoleARN> <fileInput> 
    
            Where:
                mcRoleARN - the MediaConvert Role ARN.
                fileInput -  the URL of an Amazon S3 bucket where the input file is located.
            """
    
            val mcRoleARN = "your IAM Role"
            val fileInput = "your File Input Path"
            val mcClient = MediaConvertClient { region = "your Resion"}
            val id = createMediaJobWithTemplate(mcClient, mcRoleARN, fileInput)
            println("MediaConvert job is $id")
            return id!!
        }
    }
    
    fun createMediaJobWithTemplate(mcClient: MediaConvertClient, mcRoleARN: String, fileInputVal: String): String? {
    
        try {
            val describeEndpoints = DescribeEndpointsRequest {
                maxResults = 20
            }
    
            val res = runBlocking { mcClient.describeEndpoints(describeEndpoints) }
    
            if (res.endpoints?.size!! <= 0) {
                println("Cannot find MediaConvert service endpoint URL!")
                exitProcess(0)
            }
            val endpointURL = res.endpoints!![0].url!!
            val mediaConvertClient = MediaConvertClient {
                region = "your Region"
                endpointResolver = AwsEndpointResolver { service, region ->
                    AwsEndpoint(endpointURL, CredentialScope(region = region))
                }
            }
    
            val jobSettings = JobSettings {
                inputs = listOf(
                    Input {
                        fileInput = fileInputVal
                    }
                )
            }
    
            val createJobRequest = CreateJobRequest {
                role = mcRoleARN
                settings = jobSettings
                jobTemplate = "your jobTemplate"
            }
    
            val createJobResponse = runBlocking { mediaConvertClient.createJob(createJobRequest) }
            return createJobResponse.job?.id
        } catch (ex: MediaConvertException) {
            println(ex.message)
            mcClient.close()
            exitProcess(0)
        }
    }

    이제 inputPath와, jobTemplate만 지정해줘도 이미 해두었던 설정으로 job을 생성할 수 있게 됩니다.

     

     

    참고자료

    https://velog.io/@ashappyasikonw/VOD-Streaming-Server-구축-4-AWS

     

    VOD Streaming Server 구축 4 (AWS)

    VOD 를 Input S3 넣으면 Event 가 트리거 되고 Lambda 함수를 실행시킨다. 이 때 MediaConvert의 Job이 만들어지고 Output S3 에 HLS 형식으로 저장 된다.

    velog.io

     

    'AWS' 카테고리의 다른 글

    AWS SQS vs SNS vs EventBridge  (0) 2023.05.02
    [AWS] CloudFront와 S3 연결하기[이론편]  (0) 2023.02.02
    [AWS] MediaConvert createJob Kotlin SDK 적용  (0) 2022.12.24
    [AWS] IAM이란?  (0) 2022.12.18
    [AWS] MediaConvert란? + 튜토리얼  (0) 2022.12.17

    댓글

Designed by Tistory.