VOD Transcoder

참고

네이버 클라우드 플랫폼의 상품 사용 방법을 보다 상세하게 제공하고, 다양한 API의 활용을 돕기 위해 [설명서][API 참조서]를 구분하여 제공하고 있습니다.

VOD Transcoder의 Job Operation API는 두 가지 버전인 (v1, 구버전)과 (v2, 신버전)를 제공하고 있습니다.

VOD Transcoder(v2, 신버전) API 참조서 바로가기 >>
VOD Transcoder(v1, 구버전) 설명서 바로가기 >> * VOD Transcoder의 File Storage 연동 및 VOD Transcoder v1 API는 2019년 5월부터 지원이 중단됩니다.

개요

VOD Transcoder는 미디어 원본 파일을 모바일, PC 등 다양한 디바이스에서 다양한 화질로 변환하는 클라우드 서비스를 HTTP API 형태로 제공합니다.

현재 VOD Transcoder API는 v1(File Storage 지원)과 v2(Object Storage 지원)을 제공하고 있습니다.


단, VOD Transcoder의 File Storage 연동 및 VOD Transcoder v1 API는 2019년 5월부터 지원이 중단될 예정이며, v1 API Reference는 NAVER Cloud Platform 설명서(구, 사용자 가이드) 에서 확인하실 수 있습니다.


VOD Transcoder v1 API Reference 바로가기 >


VOD Trascoder API v2 제약사항

  • VOD Transocder API v2는 안정적인 처리를 위해 초당 12회로 요청 수를 제한하고 있습니다.

VOD Transcoder 지원 스펙

  • 입력 파일
    • 컨테이너 포맷: AVI, MOV, MP4, 3GP, MPG, MPEG, M4V, VOB, WMV, ASF, MKV, FLV, WEBM
    • 비디오 코덱: H.264, VP9, VP8, MPEG-2, Animated GIF
    • 오디오 코덱: AAC, MP3, MP2, PCM, FLAC, Vorbis
  • 출력 파일
    • 컨테이너 포맷: MP4
    • 비디오 코덱: H.264
    • 오디오 코덱: AAC

공통설정

VOD Transcoder API URL

https://vodtranscoder.apigw.ntruss.com/api/v2

요청 헤더

헤더 명 설명
x-ncp-apigw-timestamp 1970년 1월 1일 00:00:00 협정 세계시(UTC)부터의 경과 시간을 밀리초(Millisecond)로 나타내며
API Gateway 서버와 시간차가 5분 이상 나는 경우 유효하지 않은 요청으로 간주

x-ncp-apigw-timestamp:{Timestamp}
x-ncp-apigw-api-key API Gateway에서 발급받은 키
x-ncp-apigw-api-key:{API Gateway API Key}
x-ncp-iam-access-key 네이버 클라우드 플랫폼 포털에서 발급받은 Access Key ID
x-ncp-iam-access-key:{Sub Account Access Key}
x-ncp-apigw-signature-v2 Access Key ID 와 맵핑되는 Secret Key로 암호화한 서명
HMAC 암호화 알고리즘은 HmacSHA256 사용
x-ncp-apigw-signature-v2:{API Gateway Signature}
Content-Type Request body가 포함된 요청의 경우 Content type을 application/json 으로 요청
Content-Type: application/json

인증 헤더

VOD Transcoder API를 사용하기 위해서는 API Gateway 인증이 필요합니다.

상세한 API Gateway 인증 관련 가이드는 NAVER CLOUD PLATFORM API 참고 부탁드립니다.

AUTHPARAMS 생성하기

AUTHPARAMS 요청 예시
curl -i -X GET \
   -H "x-ncp-apigw-timestamp:1505290625682" \
   -H "x-ncp-apigw-api-key:cstWXuw4wqp1EfuqDwZeMz5fh0epaTykRRRuy5Ra" \
   -H "x-ncp-iam-access-key:D78BB444D6D3C84CA38A" \
   -H "x-ncp-apigw-signature-v2:WTPItrmMIfLUk/UyUIyoQbA/z5hq9o3G8eQMolUzTEo=" \
 'https://vodtranscoder.apigw.ntruss.com/api/v2/jobs?limit=10'
  • Signature 생성(개행 문자는 \n을 사용)

    • 요청에 맞게 StringToSign를 생성하고 SecretKey로 HmacSHA256 알고리즘으로 암호화한 후 Base64로 인코딩합니다.

    • 이 값을 x-ncp-apigw-signature-v2로 사용합니다.

    요청 StringToSign
    GET /api/v2/jobs?limit=10
    x-ncp-apigw-timestamp={timestamp}
    x-ncp-apigw-api-key={apiKey}
    x-ncp-iam-access-key={accesskey}
    x-ncp-apigw-signature-v2={signature}
    GET /api/v2/jobs?limit=10
    {timeStamp}
    {accessKey}
  • 샘플 코드

public String makeSignature() {
    String space = " ";                     // 공백
    String newLine = "\n";                  // 줄바꿈
    String method = "GET";                  // HTTP 메소드
    String url = "/api/v2/jobs?limit=10";   // 도메인을 제외한 "/" 아래 전체 url (쿼리스트링 포함)
    String accessKey = "{accessKey}";       // access key id (from portal or Sub Account)
    String secretKey = "{secretKey}";       // secret key (from portal or Sub Account)
    String timestamp = String.valueOf(System.currentTimeMillis());      // 현재 타임스탬프 (epoch, millisecond)

    String message = new StringBuilder()
        .append(method)
        .append(space)
        .append(url)
        .append(newLine)
        .append(timestamp)
        .append(newLine)
        .append(accessKey)
        .toString();

    SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA256");
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(signingKey);

    byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
    String encodeBase64String = Base64.encodeBase64String(rawHmac);

  return encodeBase64String;
}
/*
https://code.google.com/archive/p/crypto-js/
https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/crypto-js/CryptoJS%20v3.1.2.zip
*/

/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
<script type="text/javascript" src="./CryptoJS/rollups/hmac-sha256.js"></script>
<script type="text/javascript" src="./CryptoJS/components/enc-base64.js"></script>

function makeSignature(secretKey, method, url, timestamp, accessKey) {
    var space = " ";
    var newLine = "\n";

    var hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, secretKey); // secret key
    hmac.update(method);        // HTTP 메소드
    hmac.update(space);         // 공백
    hmac.update(url);           // 도메인을 제외한 "/" 아래 전체 url (쿼리스트링 포함)
    hmac.update(newLine);       // 줄바꿈
    hmac.update(timestamp);     // 현재 타임스탬프 (epoch, millisecond)
    hmac.update(newLine);       // 줄바꿈
    hmac.update(accessKey);     // access key (from portal or iam)

    var hash = hmac.finalize();

    return hash.toString(CryptoJS.enc.Base64);
}
import sys
import os
import hashlib
import hmac
import base64
import requests
import time

def make_signature():
    timestamp = int(time.time() * 1000)
    timestamp = str(timestamp)              # 현재 타임스탬프 (epoch, millisecond)

    access_key = "{accessKey}"              # access key id (from portal or Sub Account)
    secret_key = "{secretKey}"              # secret key (from portal or Sub Account)
    secret_key = bytes(secret_key, 'UTF-8')

    method = "GET"                          # HTTP 메소드
    uri = "/api/v2/jobs?limit=10"           # 도메인을 제외한 "/" 아래 전체 url (쿼리스트링 포함)

    message = method + " " + uri + "\n" + timestamp + "\n"
    + access_key
    message = bytes(message, 'UTF-8')
    signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
    return signingKey
function makeSignature() {
    nl=$'\\n'

    TIMESTAMP=$(echo $(($(date +%s%N)/1000000)))    # 현재 타임스탬프 (epoch, millisecond)
    ACCESSKEY="{accessKey}"                         # access key id (from portal or Sub Account)
    SECRETKEY="{secretKey}"                         # secret key (from portal or Sub Account)
    METHOD="GET"                                    # HTTP 메소드
    URI="/api/v2/jobs?limit=10"                     # 도메인을 제외한 "/" 아래 전체 url (쿼리스트링 포함)

    SIG="$METHOD"' '"$URI"${nl}
    SIG+="$TIMESTAMP"${nl}
    SIG+="$ACCESSKEY"

    SIGNATURE=$(echo -n -e "$SIG"|iconv -t utf8 |openssl dgst -sha256 -hmac $SECRETKEY -binary|openssl enc -base64)
}

VOD Transcoder API 요청 구성

Header
  x-ncp-apigw-timestamp:{Timestamp}
  x-ncp-apigw-api-key:{API Gateway API Key}
  x-ncp-iam-access-key:{Sub Account Access Key}
  x-ncp-apigw-signature-v2:{API Gateway Signature}
  Content-Type:application/json
Body
  Json Object
URL
  https://vodtranscoder.apigw.ntruss.com/api/v2/{action}

VOD Transcoder API 요청 샘플

curl -i -s -X POST \
 -H "Content-Type:application/json" \
 -H "x-ncp-apigw-timestamp:1521787414578" \
 -H "x-ncp-apigw-api-key:6uxz1nKkcYwUjWRG5Q1V7NsW0i5jErlu2NjBXXgy" \
 -H "x-ncp-iam-access-key:6uxz1nKkcYwUjWRG5Q1V7NsW0i5jErlu2NjBXXgy" \
 -H "x-ncp-apigw-signature-v2:iJFK773KH0WwQ79PasqJ+ZGixtpDQ/abS57WGQdld2M=" \
 "https://vodtranscoder.apigw.ntruss.com/api/v2/jobs"\
 -d '{"jobName": "apitest", "inputs": [{ "inputBucketName": "api-test","inputFilePath": "/[MV] IU - Palette.mp4"}],   "output":{"outputBucketName": "api-test","outputFilePath": "/vodtr/","thumbnailOn":"true","thumbnailBucketName": "api-test","thumbnailFilePath":"/vodtr/","outputFiles": [{"presetId": "0dfd1eee-04c9-11e8-b51d-421453cae184","outputFileName": "720p"},{"presetId": "0e9a4953-04c9-11e8-b51d-421453cae184","outputFileName": "1080p"},{"presetId": "0e526ae0-04c9-11e8-b51d-421453cae184","outputFileName": "480p"}]}}'

VOD Transcoder API Content-Type

VOD Transcoder API HTTP Request와 Response Body를 통해 전달되는 모든 데이터의 Content-type은 application/json을 사용합니다.

사용 시나리오


Step 1. Object Storage 에 변환할 영상 업로드

VOD Transcoder로 변환할 영상을 네이버 클라우드 플랫폼 Object Storage에 업로드합니다. VOD Transcoder에서 지원하는 영상 확장자 정보는 다음과 같습니다.

만약 지원되지 않는 확장자 변환이 필요하다면, 고객 센터로 문의 부탁드립니다.

  • 지원 확장자: flv, fmp4, gif, mp3, mp4, mpg, mxf, oga, ogg, ts, wav, webm

Object Storage에 대한 자세한 내용은 Object Storage 사용 가이드를 참고 부탁드립니다.

Step 2. 인증키 생성

API 인증키 생성

VOD Transcoder API는 네이버 클라우드 플랫폼 API Gateway를 통하여 제공되며, API Gateway에 등록된 API를 사용하기 위해서는 3가지 인증키(Access Key ID, Secret Key, API Key)를 발급받아야 합니다.

API 인증키 발급에 대한 자세한 내용은 NAVER CLOUD PLATFORM 인증절차 가이드를 참고 부탁드립니다.

  • 인증키 생성
    • 네이버 클라우드 플랫폼 포털의 마이페이지 > 계정관리 > 인증키 관리 메뉴에서 신규 API 인증키 생성을 클릭하여 Access Key ID, Secret Key를 생성합니다.
    • 만약 Access Key ID, Secret Key가 있다면 해당 키를 사용합니다.
  • API Key 생성
    • Console의 API Gateway 메뉴에서 API Key 생성을 클릭하여 API Key를 생성합니다.

Step 3. 프리셋 목록 조회: presetId 확인

프리셋 목록을 조회하여 변환할 presetId를 확인합니다.

요청 예시

GET https://vodtranscoder.apigw.ntruss.com/api/v2/presets

응답 예시

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 12 Sep 2018 09:53:32 GMT
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
x-ncp-trace-id: 36c9k60om4p3238cpmc9gm4cj4

{
  "presets": [
    {
      "name": "Generic 360p 4:3",
      "format": "MP4",
      "audio": {
        "codec": "AAC",
        "codecOptions": {
          "profile": "AAC_LC"
        },
        "channel": "2",
        "bitrate": "128",
        "samplingRate": "44100"
      },
      "video": {
        "codec": "H264",
        "codecOptions": {
          "profile": "BASELINE",
          "level": "3",
          "referenceFrames": "3"
        },
        "bitrate": "600",
        "width": "480",
        "height": "360",
        "framerate": "30.0",
        "keyframeInterval": "90",
        "rateControl": "ABR",
        "resizeType": "SHRINK_TO_FIT"
      },
      "presetId": "0dfd1eee-04c9-11e8-b51d-421453cae184",
      "presetGroup": "system",
      "type": "360P",
      "costType": "SD",
      "createdTime": 0
    },
    ...
    ],
     "error":{
        "errorCode":0,
        "message":"Ok"
     }
}

Step 4. Job 생성

필수 설정값을 json 으로 만들어 Job 생성 요청의 body 에 넣어 보냅니다.

요청 예시 (360p, 480p, 1080p 3개 화질로 영상을 변환하는 Job 생성 요청)

POST https://vodtranscoder.apigw.ntruss.com/api/v2/jobs

{
  "jobName": "apitest",
  "inputs": [{
      "inputBucketName": "api-guide",
      "inputFilePath": "/Sample.mp4"
  }],
   "output":{
    "outputBucketName": "api-guide",
    "outputFilePath": "/vodtr/",
    "thumbnailOn": "true",
    "thumbnailBucketName": "api-guide",
    "thumbnailFilePath": "/vodtr/",
    "thumbnailFileFormat": "PNG",
    "thumbnailAccessControl":"PRIVATE",
    "outputFiles": [
      {
         "presetId": "0dfd1eee-04c9-11e8-b51d-421453cae184",
         "outputFileName": "360p",
         "accessControl":"PRIVATE"
      },
      {
         "presetId": "0e9a4953-04c9-11e8-b51d-421453cae184",
         "outputFileName": "1080p",
         "accessControl":"PRIVATE"
      },
      {
         "presetId": "0e526ae0-04c9-11e8-b51d-421453cae184",
         "outputFileName": "480p",
         "accessControl":"PRIVATE"
      }
   ]
  }
}

응답 예시

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 12 Sep 2018 10:18:11 GMT
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
x-ncp-trace-id: 68d1o68pm4cr63gc3169gm4p34

{
    "jobs":[
        {
            "jobId":"ohkivb8pbqxxo5z8kayhn8pqnpnzmkbz"
        }
    ],
    "error":{
        "errorCode":0,
        "message":"Ok"
    }
}

Step 5. Job 생성 확인

Job 목록 API 요청을 통해 현재까지 생성된 Job 을 조회할 수 있으며, Job 의 상세 정보까지 함께 확인할 수 있습니다.

기본적으로 조회 시점부터 1달 이내 생성된 Job 목록을 조회할 수 있으며, 파라미터를 설정하여 최대 3개월까지 Job을 조회할 수 있습니다. (Job 목록 조회 참고)

요청 예시

GET https://vodtranscoder.apigw.ntruss.com/api/v2/jobs

응답예시

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 12 Sep 2018 10:20:21 GMT
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
x-ncp-trace-id: 3cc9hcpim4c9h62oj3cgo6ccr5

{
    "jobs":[
    {
        ...
        "status":"SUCCESS",
        "jobErrorCode":"OK",
        "storageType":"object",
        "jobName":"api-guide",
        "inputs":[
           {
              "metadata":{
                 "fileName":"Sample.mp4",
                 "fileSize":411355012,
                 "duration":600,
                 "profile":{
                    "videoCodec":"AVC",
                    "videoBitrate":"5120.0",
                    "profile":"",
                    "width":1920,
                    "height":1080,
                    "level":"",
                    "framerate":"29.97",
                    "keyframeInterval":0,
                    "audioCodec":"AAC",
                    "audioBitrate":"320",
                    "audioSamplingRate":"48000.0",
                    "audioChannel":2,
                    "containerFormat":"MPEG-4"
                 }
              },
              "inputBucketName":"api-guide",
              "inputFilePath":"/Sample.mp4"
           }
           ],
           "output":{
              "outputBucketName":"api-guide",
              "outputFilePath":"/vodtr/",
              "thumbnailOn":"true",
              "thumbnailBucketName":"api-guide",
              "thumbnailFilePath":"/vodtr/",
              "thumbnailFileFormat":"PNG",
              "thumbnailAccessControl":"PRIVATE",
              "outputFiles":[
                 {
                    "presetId":"0dfd1eee-04c9-11e8-b51d-421453cae184",
                    "outputFileName":"720p.mp4",
                    "accessControl":"PRIVATE",
                    "metadata":{
                       "fileName":"720p.mp4",
                       "fileSize":194916970,
                       "duration":600.666.0,
                       "profile":{
                          "videoCodec":"AVC1",
                          "videoBitrate":"2433.0",
                          "profile":"",
                          "width":1280,
                          "height":720,
                          "level":"0",
                          "framerate":"30.0",
                          "keyframeInterval":0,
                          "audioCodec":"AAC",
                          "audioSamplingRate":"44100.0",
                          "audioChannel":2,
                          "containerFormat":"
                       }
                    }
                 }
              ]
           }
        }
     ],
     "error":{
        "errorCode":0,
        "message":"Ok"
     }
}

API를 통해 생성된 Job의 상세 현황은 VOD Transcoder 콘솔에서 보다 자세하게 확인하실 수 있습니다.

오퍼레이션


아쉬운 점이 있다면 이야기해 주세요.
0/5000
내용을 입력해 주세요
의견 보내기