O N L I N E V I D E O P L A T F O R M Getting Started Vcase API 2016.12.15
Table of Content Vcase 제공범위... 2 기능및특징... 3 전체기능목록... 11 연동방식... 12 연동정보... 13 사이트접속및회원가입 / 서비스생성... 13 Access Token 발급... 14 API 동작방식... 15 GET 방식의 API 호출예제... 15 CURL 예제... 15 JAVA 예제... 16 PHP 예제... 18 POST 방식의 API 호출예제... 19 CURL 예제... 19 JAVA 예제... 20 PHP 예제... 22 DELTE 방식의 API 호출예제... 23 CURL 예제... 23 JAVA 예제... 23 PHP 예제... 25 업로드... 27 업로드와동시에콘텐츠를그룹에지정... 28 업로드, 인코딩, 전송그리고작업상태알림... 28 업로드알림설정... 30 작업알림설정... 31 인코딩알림설정... 32 전송알림설정... 33 라이브프로파일설정... 35
라이브채널생성과라이브인코딩... 36 라이브채널조회... 37 라이브채널종료... 39
Chapter 1 Vcase 소개 Vcase 를사용해주셔서감사드립니다. Vcase 는미디어서비스의개발및운영을위한개발 프레임워크와다양한미디어핵심기능을클라우드기반으로제공하는온라인비디오플랫폼입니다. 관리를위한웹콘솔과연동을위한 RESTful API, SDK, 기술지원서비스를제공합니다. 관리자 서비스 Vcase 연동 웹콘솔 API 문서및샘플 업로드 변환 콘텐츠관리 전송 라이브 기술 퍼블리싱 보안 플레이어 광고 통계 방송 채팅 자원 고성능서버 대용량스토리지 Global CDN 24 시간관리 1
Vcase 제공범위 사업자는미디어서비스를운영하기전에라인계약부터미디어시스템개발및설치까지복잡한과정이필요하며, 시스템확장을항상고려해야합니다. Vcase 는클라우드기반의시스템인프라와각종미디어기술을제공하며, 시스템확장및분산이자동으로이루어집니다. 가입후 API 만연동하면운영에대한고민을할필요가없습니다. 미디어사업자는 Vcase 를통해비즈니스본연의업무에만집중할수있습니다. 계약 - 라인과공간 - CDN 미디어시스템구매및설치 - 스토리지 - 트랜스코더 - 스트리밍서버 - 미디어솔루션 ( 플레이어, DRM, 광고 ) 시스템부하분산 콘텐츠관리시스템개발및설치 - 미디어시스템연동 - 콘텐츠관리 확장필요 시스템모니터링 - 24 Hours 서비스운영 미디어서비스개발및설치 Vcase 제공범위 고객사업무범위 2
기능및특징 Vcase 는미디어서비스를개발, 운영하는가장중요한업무에만집중할수있도록, 서버를설치하고, CDN 과연동하고, 미디어솔루션을운영하거나갑자기늘어난사용자에대응하기위해긴급하게서버를확장하는것과같은고민을모두해결해드립니다. 단지가입하고, 미디어서비스와 Vcase 의 API 만연결하면됩니다. 대시보드 웹콘솔의홈화면에서대시보드를제공하여한눈에 서비스현황을살펴볼수있습니다. 콘텐츠업로드및관리 사용할수있습니다 HTTP 나 FTP 로미디어콘텐츠를업로드할수 있습니다. 업로드후에는썸네일, 코덱과같은미디어 정보를자동으로추출하며, 사용자정의메타를 3
비디오편집 웹페이지에서바로미디어를 Merging 하고 Clipping 하는편집기능을사용하여쉽게새로운 비디오를만들어낼수있습니다. 작업자동화 미디어를업로드하면자동으로변환, 암호화, 전송을 시작합니다. 자동화프로파일로변환방식과암호화, 배포방법을자유롭게추가할수있습니다. 업로드 - 웹 - FTP ( 대용량 ) - API 작업자동화 - 변환 - 암호화 (DRM) - 배포 고객미디어서비스 - Web - App - Tablet - TV 4
라이브채널 됩니다. 매우간편하게라이브채널을생성하고관리할수있습니다. IP 카메라로입력 URL 에비디오를송출하면, 스트리밍 URL 로라이브방송을할수있게 라이브인코딩 모든라이브채널에인코딩프로파일을설정하여 실시간으로인코딩된출력을사용할수있습니다. 5
라이브 DVR 녹화등꼭필요한기능을함께제공합니다. 비디오스트림 (HLS, RTSP, RTMP) 을파일로 녹화하여새로운컨텐츠로등록하거나다른 URL 로 재송출할수있습니다. 파일저장주기, 예약시간 라이브편성 VoD 와라이브채널을교차편성하여라이브로송출할수있습니다. 편리한편성 UI/UX 를제공하며, 긴급편성을통해만약의상황을대비할수있습니다. 6
개인방송 개인방송서비스를개발하기위한모든인프라와솔루션을제공합니다. 서버개발을지원하기위해라이브채널관리를포함하여, 녹화, 광고등다양한 기능을제공하며클라이언트개발을지원하기위해송출 SDK, 채팅 SDK 를지원합니다. Vcase 로개인방송서비스를더욱쉽고빠르게개발하고, 안정적으로운영할수있습니다. Smart Phone - ios - Android RESTful API Admin Page Web Cam PC 클라이언트지원 ios, Android 송출 SDK 채팅 SDK 플레이어 SDK Web 웹채팅 SDK PC 방송툴지원 API 채널관리 라이브채널 채팅채널 채널녹화 채널광고 썸네일및메타추출 타임머신 7
VoD 광고 Vcase 는수익화를위해자체광고를관리하고원하는위치에삽입할수있는기능과미국 IAB 표준인 VAST 외부광고서버를연동할수있는 방법을지원합니다. 제공되는 API 로플레이어에직접광고를연동하는방식을선택하거나제공되는플레이어를사용하는방식을선택할수있습니다. 라이브중간광고 설치가필요없습니다. 라이브채널에요청즉시광고를넣을수있습니다. 광고를선택하고, 광고삽입버튼만클릭하면됩니다. 웹기반에서모든것이처리되므로, 별도의프로그램 8
지역광고 지역광고그룹을관리하고, 라이브스트림에지역별로광고를전송할수있습니다. 광고시작 API 를통해원하는채널에언제든지광고를보낼수 있으므로개인방송과결합하여방송자가직접광고를선택하고시작할수있습니다. 통계 플레이어와스트리머로부터대량의데이터를수집하여, 고객에게의미있는통계를제공하기위해빅데이터처리시스템을갖추고있습니다. 인기 콘텐츠순위뿐만아니라콘텐츠별인게이지먼트스코어와같은의미있는통계를제공합니다. 9
신디케이션 유투브채널과 VoD 동기화기능을제공하고편성 라이브채널을유투브라이브에재송출할수 있습니다. API 및 SDK Vcase 의모든기능은 API 로제공되어사업자의서비스에연동할수있습니다. 또한모바일플레이어, 플래시플레이어등필수미디어솔루션, 카메라송출 모듈을 SDK 형태로제공하여더욱강력한미디어서비스를운영할수있도록지원합니다. 문서및샘플을제공하여더욱손쉽게연동할수있고, 기술지원팀이항시대기하여빠르게문의를처리하고있습니다. 웹콘솔 API 문서및샘플 SDK 10
전체기능목록 업로드 - 웹브라우저 (Web, Flash/HTML5) - 자동녹화업로드 (DVR 연동 ) - API - FTP Bulk 업로드 작업자동화 - 변환, 암호화, 배송프로파일관리 - 업로드시자동으로동작 - 작업현황모니터링 변환 - 미리정의된프로파일제공 - 고성능인코딩시스템 - 품질별제공 : 해상도, 비트레이트, - 대부분의코덱과컨테이너지원프레임레이트등 - 고급사용자를위한상세한인코딩 - 대상장치별제공 : PC, 모바일, 옵션테블릿, 스마트 TV 등 - 다양한메타정보추출 - 이미지오버레이 - 비디오, 오디오, 이미지, 자막콘텐츠 - 메타관리 콘텐츠관리 관리 - 사용자정의메타정보관리 - 그룹관리 (Playlist) - 권한관리 - 비디오편집 (Merging, Clipping) - DRM 시스템연동 라이브스트리밍 - 라이브채널생성및관리 - 라이브스트림녹화및재송출 - 라이브인코딩 - 라이브중간광고 - 라이브편성송출 - 편성유투브신디케이션 개인방송 - 채널관리 ( 방송채널, 채팅채널 ) - 채널메타추출 ( 썸네일및인코딩 - 채팅 SDK - 방송 SDK 정보 ) 전송 - FTP 전송 - 유투브신디케이션 퍼블리싱 - N 스크린플레이어퍼블리싱 - 업로드 / 다운로드가능한 URL - VOD, Live 스트리밍 - 접근제어 광고 - 자체광고관리 - Double Click 연동 - Video 광고삽입 ( 전, 중, 후 ) - 라이브지역광고 분석, 통계 - 콘텐츠, 기간, 장치별 - 재생횟수, 재생구간, 네트워크트레픽정보제공 - 사용패턴 - 가장많이재생된콘텐츠 - 콘텐츠소비행태 연동 - Restful API - 문서및샘플 - SDK ( 플레이어, 카메라 ) 계정 - 다중관리자 - API 접근토큰관리 - 관리자권한관리 11
Chapter 2 연동시작하기 Vcase 에서는미디어서비스제공자가사용자에게고품질미디어서비스를제공할수있도록다양한미디어기술을제공하며, 모든기능은 RESTful API 와 SDK 를통해쉽게연동할수있습니다. 연동방식 Vcase 와의연동은일반적으로아래그림과같은구조를따릅니다. 고객사는 WAS 를구축하여회원 DB 나비즈니스로직을구현하고, 미디어처리관련된부분은 Vcase 에서제공하는 API 를통해처리하는것이일반적입니다. 앱, 웹, 기타어플리케이션으로제공되는사용자서비스는고객사에서구축한 WAS 에연동하여동작하고플레이어, 라이브송출, 채팅관련기능은 Vcase 에서제공하는 SDK 를이용하여쉽게구축하고안정적으로운영할수있습니다. Live Stream Player SDK (Web, Android, ios) Application LiveController Chatting SDK (Web, Android, ios) App WAS RESTful API MediaStation Camera SDK (Android, ios) Vcase SDK Web 고객사서비스구현범위 Upload Contents Upload System Vcase 12
연동정보 Vcase2 를연동하기위한주소는아래표와같습니다. Media Station api.vcase2.myskcdn.com:9090 (222.239.28.216:9090) Upload Server upload.vcase2.myskcdn.com:8081 (222.239.28.216:8081) Live Controller MediaStation 의 API 를통해발급 상세한연동 API Tutorial 은다음 URL 에서다운로드받을수있습니다. http://vcase2.myskcdn.com/static/docs/vcase User Interface Manual.pdf Vcase 에서는연동및개발을지원하기위해프리미엄고객을위한샘플웹소스 코드 (Java 기반 ) 와앱소스코드 (ios, Android) 를제공합니다. Vcase 담당자에게요청주시기바랍니다. 사이트접속및회원가입 / 서비스생성 인터넷익스플로러나파이어폭스, 크롬같은인터넷브라우저를실행하고주소표시줄에 http://vcase2.myskcdn.com 주소를입력합니다. Vcase 페이지가정상적으로표시되었다면, 우측상단의 시작하기 버튼을선택하여서비스생성및회원가입페이지로진입합니다. 회원가입페이지에서는서비스정보및사용자정보를입력할수있는데, 서비스명은한명의 사용자가여러서비스를관리할때손쉽게식별할수있도록해주는항목으로실제서비스하고자 하시는서비스의이름을입력해주시면됩니다. 이외에사용자정보부분에는서비스를관리하고자 13
하는관리자정보를입력한뒤하단의서비스생성버튼을선택하시면입력하신정보를바탕으로 새로운계정및서비스가생성됩니다. 성공적으로가입이완료되었다면기입하신이메일주소로가입환영메일이전송되며, 미디어서비스를위한모든준비가완료됩니다. Access Token 발급 Vcase 의 API 를사용하기위해서는 Access Token 을발급해야합니다. 여러개의 Access Token 을발급하여권한을조정하여목적에맞게사용할수있습니다. 오른쪽상단의계정이름을클릭하고 API 관리메뉴에서새로운토큰생성버튼을클릭하여새로운토큰을생성할수있습니다. 14
API 동작방식 MediaStaion 의 API 를호출하여 Vcase 의데이터를조회하고관리할수있습니다. API 는 GET, POST, DELETE 메소드로제공되며, API 문서에명시되어있습니다. 메소드를잘못사용하는경우동작하지않으니유의해야합니다. POST 방식의 API 를호출할때는업로드를제외하고는모두 Header 의 Content-Type 을 application/json 으로설정해야합니다. 모든응답은 JSON 포멧으로이루어져있으며다음과같은기본규칙으로응답됩니다. 응답코드는 API 문서에상세히기술되어있습니다. { "request_id": "< 요청할때입력한 request_id>", "result_code": "< 응답코드 >", "message": "< 응답데이터에대한메시지 >", "result": { < 요청리소스마다내부항목들이달라짐 > } } GET 방식의 API 호출예제 콘텐츠목록조회 API 를통해 GET 방식의 API 를호출하는예제입니다. CURL 예제 REQUEST curl -X GET -v http://222.239.28.216:9090/v1/content?access_token=19d560a31a2a4f9e8ef13075 56640dd7 RESPONSE * About to connect() to 222.239.28.216 port 9090 (#0) * Trying 222.239.28.216... connected * Connected to 222.239.28.216 (222.239.28.216) port 9090 (#0) > GET /v1/content?access_token=19d560a31a2a4f9e8ef1307556640dd7 HTTP/1.1 > User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2 15
> Host: 222.239.28.216:9090 > Accept: */* > < HTTP/1.1 200 OK < Server: Apache-Coyote/1.1 < Access-Control-Allow-Origin: * < charset: UTF-8 < Content-Type: application/json;charset=utf-8 < Transfer-Encoding: chunked < Date: Mon, 23 Jan 2017 07:44:23 GMT < {"result_code":"s000","message":" 성공 ","result":{"total_count":82,"content":[{"content _id":1800704786,"upper_content_id":0,"title":"title","content_type":"asset","create_ty pe":"uplod","media_type":"video","file_type":"orign","view_type":"plain","file_name":" vr.mp4","file_size":32868857,"duration":182485,"state":"cmplt","progress":100,"cont ainer":"mp4","video_codec":"h264", JAVA 예제 REQUEST import java.io.bufferedreader; import java.io.inputstreamreader; import java.net.httpurlconnection; import java.net.url; import java.util.hashmap; public final class Test { public static void main(string[] args) throws Exception { // Query String 추가 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("access_token", "19d560a31a2a4f9e8ef1307556640dd7"); 16
} // 콘텐츠목록조회. String result = requestcontentlist("222.239.28.216", 9090, map); System.out.println(result); public static String requestcontentlist(string host, Integer port, HashMap<String, Object> map) throws Exception { StringBuffer querystring = new StringBuffer(); for( String key : map.keyset() ){ querystring.append(key); querystring.append("="); querystring.append(map.get(key)); querystring.append("&"); } querystring.tostring()); String url = String.format("http://%s:%d/v1/content?%s", host, port, URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openconnection(); // optional default is GET con.setrequestmethod("get"); //add request header int responsecode = con.getresponsecode(); System.out.println("\nSending 'GET' request to URL : " + url); System.out.println("Response Code : " + responsecode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputline; StringBuffer response = new StringBuffer(); 17
} } RESPONSE while ((inputline = in.readline())!= null) { response.append(inputline); } in.close(); return response.tostring(); PHP 예제 REQUEST <?php $querystring = array(); $querystring['access_token'] = '19d560a31a2a4f9e8ef1307556640dd7'; $result = requestcontentlist("222.239.28.216",9090, $querystring); echo $result; function requestcontentlist($host, $port, $querystring) { $query; foreach ( $querystring as $key => $value ) { $query.= $key; $query.= '='; $query.= $value; $query.= '&'; } $ch = curl_init(); 18
// set url curl_setopt($ch, CURLOPT_URL, "http://".$host.":".$port."/v1/content?".$query); //return the transfer as a string curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // $output contains the output string $output = curl_exec($ch); // close curl resource to free up system resources curl_close($ch); return $output; }?> RESPONSE POST 방식의 API 호출예제 콘텐츠메타정보수정 API 를통해 POST 방식의 API 를호출하는예제입니다. Vcase 의업로드를제외한모든 POST 메시지는 Json 방식을사용하므로 HTTP Header 의 Content-Type 을 application/json 으로보내야합니다. CURL 예제 REQUEST curl -X POST -H "Content-Type: application/json" -d '{"params":{"access_token":"19d560a31a2a4f9e8ef1307556640dd7", "title":"modified Title"}}' http://222.239.28.216:9090/v1/content/1800704786 19
RESPONSE {"result_code":"s000","message":" 성공 "} JAVA 예제 REQUEST import java.io.bufferedreader; import java.io.dataoutputstream; import java.io.inputstreamreader; import java.io.reader; import java.net.httpurlconnection; import java.net.url; import java.util.hashmap; import com.google.gson.gson; public final class Test { public static void main(string[] args) throws Exception { // 콘텐츠수정 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("access_token", "19d560a31a2a4f9e8ef1307556640dd7"); map.put("title", "Modified Title"); String result = requestmodifycontent("222.239.28.216", 9090, 1800704786L, map); System.out.println(result); } public static String requestmodifycontent(string host, Integer port, Long contentid, HashMap<String, Object> paramsmap) throws Exception { HashMap<String, Object> rootmap = new HashMap<String, Object>(); rootmap.put("params", paramsmap); 20
String requestbody = new Gson().toJson(rootMap); contentid); String url = String.format("http://%s:%d/v1/content/%d", host, port, URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openconnection(); con.setrequestmethod("post"); con.setdooutput( true ); con.setinstancefollowredirects( false ); con.setrequestproperty( "Content-Type", "Content-Type: application/json"); con.setrequestproperty( "charset", "utf-8"); con.setrequestproperty( "Content-Length", Integer.toString( requestbody.length() )); con.setusecaches( false ); con.getoutputstream().write(requestbody.tostring().getbytes("utf-8")); //add request header int responsecode = con.getresponsecode(); System.out.println("\nSending 'POST' request to URL : " + url); System.out.println("Response Code : " + responsecode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputline; StringBuffer response = new StringBuffer(); while ((inputline = in.readline())!= null) { response.append(inputline); } in.close(); return response.tostring(); 21
} } RESPONSE PHP 예제 REQUEST <?php $requestparams = array(); $requestparams['access_token'] = '19d560a31a2a4f9e8ef1307556640dd7'; $requestparams['title'] = 'Modified Title'; $result = requestmodifycontent("222.239.28.216",9090, 1800704786, $requestparams); echo $result; function requestmodifycontent($host, $port, $contentid, $requestparams) { $rootmap = array(); $rootmap['params'] = $requestparams; $data_string = json_encode($rootmap); echo $data_string; $ch = curl_init("http://".$host.":".$port."/v1/content/".$contentid); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: '. strlen($data_string)) ); 22
// $output contains the output string $output = curl_exec($ch); // close curl resource to free up system resources curl_close($ch); return $output; }?> RESPONSE DELTE 방식의 API 호출예제 콘텐츠단일삭제 API 를통해 DELETE 방식의 API 를사용하는예제입니다. CURL 예제 REQUEST curl -X DELETE -v http://222.239.28.216:9090/v1/content/1800704786?access_token=19d560a31a2a 4f9e8ef1307556640dd7 RESPONSE {"result_code":"s000","message":" 성공 "} JAVA 예제 REQUEST import java.io.bufferedreader; import java.io.dataoutputstream; import java.io.inputstreamreader; import java.io.reader; import java.net.httpurlconnection; import java.net.url; 23
import java.util.hashmap; import com.google.gson.gson; public final class Test { public static void main(string[] args) throws Exception { // 콘텐츠삭제 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("access_token", "19d560a31a2a4f9e8ef1307556640dd7"); String result = requestdeletecontent("222.239.28.216", 9090, 1800704786L, map); System.out.println(result); } public static String requestdeletecontent(string host, Integer port, Long contentid, HashMap<String, Object> map) throws Exception { StringBuffer querystring = new StringBuffer(); for( String key : map.keyset() ){ querystring.append(key); querystring.append("="); querystring.append(map.get(key)); querystring.append("&"); } String url = String.format("http://%s:%d/v1/content/%d?%s", host, port, contentid, querystring.tostring()); URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openconnection(); // optional default is DELETE con.setrequestmethod("delete"); 24
//add request header int responsecode = con.getresponsecode(); System.out.println("\nSending 'DELETE' request to URL : " + url); System.out.println("Response Code : " + responsecode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputline; StringBuffer response = new StringBuffer(); } } RESPONSE while ((inputline = in.readline())!= null) { response.append(inputline); } in.close(); return response.tostring(); PHP 예제 REQUEST <?php $querystring = array(); $querystring['access_token'] = '19d560a31a2a4f9e8ef1307556640dd7'; $result = requestdeletecontent("222.239.28.216",9090, 1800704786, $querystring); echo $result; function requestdeletecontent($host, $port, $contentid, $querystring) { 25
$query; foreach ( $querystring as $key => $value ) { $query.= $key; $query.= '='; $query.= $value; $query.= '&'; } $ch = curl_init(); // set url curl_setopt($ch, "http://".$host.":".$port."/v1/content/".$contentid."?".$query); CURLOPT_URL, //return the transfer as a string curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // set method curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); // $output contains the output string $output = curl_exec($ch); // close curl resource to free up system resources curl_close($ch); return $output; }?> RESPONSE 26
Chapter 3 콘텐츠관리 Vcase 에서는콘텐츠관리에필요한다양한기능을제공합니다. 업로드, 메타관리, 플레이리스트 관리, 자동인코딩, 자동전송 (FTP), 편집 ( 머징, 트리밍 ) 과같은기능을 API 호출을통해쉽게 사용할수있습니다. 업로드 업로드는 multipart/form-data 형식으로전송해야합니다. 주의해야할점은 MediaStation API 와다른업로드서버전용주소 (upload.vcase2.myskcdn.com:8081) 를사용한다는것입니다. API 문서에따라 file= 과 access_token= 을 multipart 로보내면업로드를할수있습니다. REQUEST curl -v -X POST -H "Content-Type: multipart/form-data" -F "access_token=19d560a31a2a4f9e8ef1307556640dd7" -F "file=@sample.mp4" -F rev=mv_102921 http://222.239.28.216:8081/v1/content/upload RESPONSE {"result_code":"s000","message":" 성공 ","result":{"content_id":1890704902}} rev 값을입력하여업로드하면 상태콜백에서해당값을다시돌려받을수있습니다. 27
업로드와동시에콘텐츠를그룹에지정 미디어서비스를구현할때사용자별, 카테고리별로콘텐츠를그룹화하고조회하는기능이필요할수있습니다. Vcase 는플레이리스트와태그를이용하여콘텐츠를그룹으로묶을수있는기능을제공합니다. 플레이리스트에콘텐츠를넣은후플레이리스트목록조회 API 를이용하여목록조회를하거나콘텐츠메타에태그를입력한후콘텐츠목록조회 API 에해당태그를넣어서검색조회를할수있습니다. 이미등록된콘텐츠의정보를수정할수도있지만콘텐츠를업로드하면서동시에태그를입력하거나플레이리스트에콘텐츠를포함시키는방법을제공합니다. 다음과같이 tags 나 playlist_ids 를추가하여업로드하면업로드와동시에콘텐츠를그룹에넣을수있습니다. REQUEST curl -v -X POST -H "Content-Type: multipart/form-data" -F "access_token=19d560a31a2a4f9e8ef1307556640dd7" -F "file=@sample.mp4" -F tags= movie,action playlist_ids= 3201704451 http://222.239.28.216:8081/v1/content/upload RESPONSE {"result_code":"s000","message":" 성공 ","result":{"content_id":1890704902}} 업로드, 인코딩, 전송그리고작업상태알림 콘텐츠가업로드되면설정된작업프로파일에따라자동으로인코딩및전송을수행하도록설정할수있습니다. 다음화면과같이웹콘솔의작업현황에서작업설정을통해새로운작업을등록할수있습니다. 콘텐츠선별, 인코딩, 암호화, 전송을설정하는자세한내용은사용자매뉴얼을참고해주시기바랍니다. 28
대용량미디어파일의업로드는효율적인콘텐츠흐름을위해고객사의 WAS 를거치지않고클라이언트에서 Vcase 의업로드서버에직접하는경우가많습니다. 이런구조에서업로드된콘텐츠의정보를고객사 WAS 에서관리해야할필요가있는경우를위해 Vcase 에서는 Callback 알람을통해콘텐츠상태정보를고객사서버로전달합니다. Application DB App WAS Callback {content_id}{state}{rev} MediaStation Web Upload Contents {rev} Upload System Response {content_id} Vcase 콘텐츠가업로드된후부터인코딩, 전송이완료될때까지의라이프사이클은다음그림과같습니다. 업로드완료, 인코딩완료, 전송완료, 작업완료시점에고객사에서설정한 URI 로상태정보를 전달합니다. {Result} {Content ID} {User Param} {Result} {Job Publish Key} {Content ID} {Target Content ID} {User Param} {Result} {Job Publish Key} {Content ID} {Target Content ID} {User Param} Callback Callback Callback 업로드시작업로드완료작업시작 트랜스코딩 시작 트랜스코딩 완료 전송시작전송완료작업완료 Upload Response Callback {File} {User Param} {Result} {Content ID} {Result} {Job Publish Key} {Content ID} {Target Content ID} {User Param} 29
업로드알림설정 업로드완료알림을받기위해서는아래화면과같이웹콘솔의업로드알림설정에콜백알림을 받을 URI 를설정하면됩니다. 콜백 URI 는 GET 또는 POST 메소드를지정하여원하는방식대로콜백을받을수있으며다음과 같은형식으로등록할수있습니다. 업로드 Callback URL 포멧 http://user-service-domain.com/vcasecallback?contents_id={content_id}&state={state}&rev={rev} user-service-domain.com/vcase-callback 은고객사서비스에서콜백을받을수있도록제작한 URI 입니다. {contents_id}, {state}, {rev} 는 Vcase 의시스템메타정보이며, 상기 URI 에서지정한 방식대로전달하게됩니다. 각각의의미는다음과같습니다. {contents_id} 업로드한원본콘텐츠의 ID 입니다. {state} 업로드상태를나타내며상태값은다음과같습니다. complt : 업로드완료 faled : 실패 {rev} 업로드시입력한사용자매개변수를그대로돌려줍니다. 고객사 DB 의 INDEX 값이나콘텐츠제목, 설명등을넣어서활용할수있습니다. 30
작업알림설정 작업완료알림은작업프로파일의작업상태보고 URI 를통해설정할수있습니다. 퍼블리시키는 콜백을받았을때어떤프로파일의콜백인지구분할수있도록하는 ID 값입니다. 이를통해설정한 프로파일중모바일용인코딩이완료되었는지, 웹용인코딩이완료되었는지체크할수있습니다. 작업이완료되거나실패하면해당내용을고객사에서설정한 URI 로알림메시지를전달합니다. 상단의 작업상태보고 URI 는인코딩, 전송이완료된후모든과정에대한상태를전달하는콜백 URI 입니다. 콜백 URI 는 GET 또는 POST 메소드를지정하여원하는방식대로콜백을받을수있으며다음과같은형식으로등록할수있습니다. 작업상태알림 URL 포멧 http://user-service-domain.com/vcase-job-callback? contents_id={content_id}&state={state}&job_profile_id={job_profile_id}&job_publish_k ey={job_publish_key}&rev={rev} user-service-domain.com/vcase-job-callback 은고객사서비스에서작업상태에대한콜백을 받을수있도록제작한 URI 입니다. {contents_id}, {state}, {rev} 와같은값은 Vcase 의시스템메타 정보이며, 상기 URI 에서지정한방식대로전달하게됩니다. 각각의의미는다음과같습니다. {contents_id} 원본콘텐츠의 ID 입니다. {state} 작업상태를나타내며상태값은다음과같습니다. complt : 모든작업완료 faled : 실패 31
{job_publish_key} {rev} 작업프로파일퍼블리싱키 업로드시입력한사용자매개변수를그대로돌려줍니다. 고객사 DB 의 INDEX 값이나콘텐츠제목, 설명등을넣어서활용할수있습니다. 인코딩알림설정 인코딩상태알림은다음과같이작업프로파일의인코딩탭에서고급설정에서인코딩상태 보고 URI 를통해설정할수있습니다. 인코딩작업이완료되거나실패하면해당내용을고객사에서설정한 URI 로알림메시지를 전달합니다. 콜백 URI 는 GET 또는 POST 메소드를지정하여원하는방식대로콜백을받을수 있으며다음과같은형식으로등록할수있습니다. 인코딩상태알림 URL 포멧 http://user-service-domain.com/vcase-encode-callback? contents_id={content_id}&state={state}&job_publish_key={job_publish_key}&target_co ntent_id={target_content_id}&rev={rev} 32
user-service-domain.com/vcase-encode-callback 은고객사서비스에서작업상태에대한콜백을받을수있도록제작한 URI 입니다. {contents_id}, {state}, {rev} 와같은값은 Vcase 의시스템메타정보이며, 상기 URI 에서지정한방식대로전달하게됩니다. 각각의의미는다음과같습니다. {contents_id} 원본콘텐츠의 ID 입니다. {state} 작업상태를나타내며상태값은다음과같습니다. complt : 모든작업완료 faled : 실패 {job_publish_key} 작업프로파일퍼블리싱키 {target_content_id} 인코딩이완료된콘텐츠의 ID 입니다. {rev} 업로드시입력한사용자매개변수를그대로돌려줍니다. 고객사 DB 의 INDEX 값이나콘텐츠제목, 설명등을넣어서활용할수있습니다. 전송알림설정 전송상태알림은다음과같이작업프로파일의전송탭에서상태보고 URI 를통해설정할수 있습니다. 전송작업이완료되거나실패하면해당내용을고객사에서설정한 URI 로알림메시지를전달합니다. 콜백 URI 는 GET 또는 POST 메소드를지정하여원하는방식대로콜백을받을수있으며다음과 같은형식으로등록할수있습니다. 전송상태알림 URL 포멧 33
http://user-service-domain.com/vcase-transmission-callback? contents_id={content_id}&state={state}&job_publish_key={job_publish_key}&target_co ntent_id={target_content_id}&rev={rev} user-service-domain.com/vcase-transmission-callback 은고객사서비스에서작업상태에대한콜백을받을수있도록제작한 URI 입니다. {contents_id}, {state}, {rev} 와같은값은 Vcase 의시스템메타정보이며, 상기 URI 에서지정한방식대로전달하게됩니다. 각각의의미는다음과같습니다. {contents_id} 원본콘텐츠의 ID 입니다. {state} 전송상태를나타내며상태값은다음과같습니다. complt : 모든작업완료 faled : 실패 {job_publish_key} 전송프로파일퍼블리싱키 {target_content_id} 전송완료된콘텐츠의 ID 입니다. {rev} 업로드시입력한사용자매개변수를그대로돌려줍니다. 고객사 DB 의 INDEX 값이나콘텐츠제목, 설명등을넣어서활용할수있습니다. 34
Chapter 4 라이브채널관리 Vcase 는라이브채널을생성하고관리하는기능을제공합니다. RTMP 입력을받아서 CDN 을통해 RTMP, HLS, RTSP 와같은프로토콜로재송출할수있으며중간광고및동시접속자통계데이터를제공합니다. 특히라이브인코딩기능을통해어떤입력이들어오더라도최적의비디오품질로조정하여서비스할수있습니다. 라이브프로파일설정 라이브프로파일은웹콘솔의 라이브프로파일 메뉴에서추가하고삭제할수있습니다. 라이브프로파일은다음과같이비율방식, 비디오품질, 오디오품질에대한설정값을 제공합니다. ID 값을라이브채널생성시전달하여해당채널을인코딩할수있습니다. 35
기본프로파일은라이브채널생성시라이브프로파일을별도로지정하지않아도 기본적으로인코딩을수행하는프로파일을의미합니다. 라이브채널생성과라이브인코딩 다음과같이 API 를호출하여라이브채널을생성할수있습니다. REQUEST curl -v -X POST -H "Content-Type: application/json" -d '{"params":{"access_token":"19d560a31a2a4f9e8ef1307556640dd7", "name":"live Channel }}' http://222.239.28.216:9090/v1/live/channel 36
RESPONSE {"result_code":"s000","message":" 성공 ","result":{"live_channel_id":1490010789}} 라이브채널을생성할때다음과같이 live_profile_ids 에라이브프로파일의 ID 를입력하여채널을 인코딩하여출력할수있습니다. 기본프로파일은별도로지정하지않아도자동으로인코딩이 적용됩니다. REQUEST curl -v -X POST -H "Content-Type: application/json" -d '{"params":{"access_token":"19d560a31a2a4f9e8ef1307556640dd7", "name":"live Channel, live_profile_ids :[123332133, 21321321312, 209999121]}}' http://222.239.28.216:9090/v1/live/channel RESPONSE {"result_code":"s000","message":" 성공 ","result":{"live_channel_id":1490010789}} 라이브채널조회 라이브채널은생성한후생성된채널의정보는다음과같이라이브채널 ID 값을인자로 API 를 호출하여조회할수있습니다. REQUEST curl -v -X GET -H http://222.239.28.216:9090/v1/live/channel/1490010789? access_token=19d560a31a2a4f9e8ef1307556640dd7 RESPONSE {"result_code":"s000","message":" 성공 ","result":{"live_channel":{"live_channel_id":149 0010789,"name":"Live Channel","view_type":"plain","live_channel_type":"basic","use_ad":false,"is_decided":f alse,"is_ad_playing":false,"reg_date":1485267362,"mod_date":1485267362,"active":t rue, 라이브채널을조회하여정보를확인하면라이브입력정보, 라이브출력정보그리고다양한 메타정보를함께제공하는것을확인할수있습니다. 37
라이브입력주소는제 3 자에게유출될경우방송사고등심각한문제를발생시킬수있기때문에 보안이보장되어야합니다. Vcase 에서는다음표와같이 Stream 주소를예측불가능한 Key 로 발급하고, 매번생성할때마다값을변경하여서보안에문제가없도록지원하고있습니다. HOST : 118.219.58.47/LC STREAM : "BzG90hrZF00C" 라이브출력주소는적용된인코딩프로파일개수만큼제공되며인코딩이실시간으로적용됩니다. 각출력주소는 RTMP, HLS, HLST(HLS Time Machine), RTSP, TLS(T Live Streaming) 프로토콜을지원합니다. 38
라이브채널종료 라이브채널은고객사별로제한된숫자를제공하기때문에라이브스트리밍이완료되면꼭 API 를호출하여채널을종료해야합니다. 고객사에할당된라이브채널을모두사용하면새로운라이브채널생성이실패할수있습니다. 라이브채널은다음과같은방식으로채널을종료할수있습니다. REQUEST curl -v -X DELETE http://222.239.28.216:9090/v1/live/channel/1490010789? access_token=19d560a31a2a4f9e8ef1307556640dd7 RESPONSE {"result_code":"s000","message":" 성공 "} 39