|
나클립스 모바일 플레이어 SDK(iOS 용) - 개발자 레퍼런스 가이드
|
|
|
S/W 명칭 |
iOS 기반 나클립스 플레이어 모바일 SDK (Naclips Player Mobile SDK for iOS) |
|
S/W 분류 |
어플리케이션 개발용 SDK(Software Development Kit) 프레임워크 라이브러리 |
|
개발 언어 / 개발 툴 |
Swift V4.0 / Xcode V9.4 |
|
적용 OS/Platform |
iOS System |
|
S/W 패키지 구성 |
SDK 라이브러리(Nagent.framework), 샘플 소스 |
|
Nagent | -> cxNagent > cx_serv_retv > cx_media_inf |
| -> cxString |
| -> cxEtce > cx_media_type |
|
cxNagent |
SDK 메인 클래스, 암호화된 나클립스 스트리밍 소스URL 쿼리 및 썸네일 이미지를 디바이스 캐시에 다운로드 한다. |
|
cx_serv_retv |
나클립스 VOD 서버 엔진으로부터 쿼리된 스트리밍 정보를 저장하고 관리하는 클래스. |
|
cx_media_inf |
나클립스 VOD 서버 엔진으로부터 쿼리된 미디어 파일의 헤더 정보가 저장되는 클래스. |
|
cxString |
문자열 관련 Static 함수를 저장하는 클래스. |
|
cxEtce |
기타 Static 함수를 저장하는 클래스. |
|
cx_media_type |
비디오 / 오디오 파일 확장자 쿼리 클래스. |
|
|
cxNagent |
|
getPropertyBool(s_name:String)->Bool |
Bool 형의 프로퍼티 값을 가져온다. s_name 인자값은 setProperty 메서드 참조. |
|
getPropertyInt(s_name:String)->Int |
int 형의 프로퍼티 값을 가져온다. s_name 인자값은 setProperty 메서드 참조.
|
|
getPropertyStr(s_name:String)->String |
String 형의 프로퍼티 값을 가져온다. s_name 인자값은 setProperty 메서드 참조.
|
|
getServerURL(s_name:String)->URL? |
동영상 파일 위치 URL 또는 썸네일 이미지 디렉토리 위치 URL 값 가져옴.
|
|
getServretv()->cx_serv_retv |
cxNagent 클래스 객체의 cx_serv_retv 클래스 객체를 리턴.
|
|
getStatus()->T_RET |
cxNagent 클래스 객체의 현재 상태값을 가져온다.
|
|
getThumbnailPath(i_dx:Int)->String |
i_dx 번째 썸네일 이미지 파일의 디바이스 캐시 폴더에 저장된 위치를 가져온다.
|
|
getThumbnailSec(i_dx:Int)->Int |
i_dx 번째 썸네일 이미지에 해당하는 동영상 재생 위치 시간값을 가져온다.(초단위 시간)
|
|
getTimeoutConn()->Double |
cxNagent 클래스 객체에 설정된 서버 접속 타임아웃 시간값을 가져온다.(초단위 시간)
|
|
getTimeoutRecv()->Double |
cxNagent 클래스 객체에 설정된 데이터 수신 타임아웃 시간값을 가져온다.(초단위 시간)
|
|
prepareStream() |
cxNagent 객체의 auto_play 옵션의 비활성 되어 있을때, 수동으로 동영상 플레이를 시작한다.
prepareStream()은 나클립스 VOD 서버에 접속하여 암호화된 미디어 스트리밍 URL을 쿼리한다.
|
|
reset() |
나클립스 서버에서 쿼리한 스트리밍 정보값을 초기화 한다.
|
|
setEvent(eventName:String, action: @escaping ((Any?)->())) |
eventName에 해당하는 이벤트 발생시 처리될 action 함수명을 등록한다. 이벤트명은 아래와 같다.
cxNagent.T_XEVT.SFX_GetEncuri : 암호화된 동영상 스트리밍 URL 쿼리 완료시.
cxNagent.T_XEVT.SFX_GetThumbs : 썸네일 이미지 파일을 서버로 부터 수신하여 저장 완료.
cxNagent.T_XEVT.SFX_ReturnError : 에러 발생시.
|
|
setProperty(s_name:String, v_value: Any)->Bool |
프로퍼티 값을 cxNagent 객체의 입력한다. s_name 인자 값은 아래와 같다.
Int 형 프로퍼티.
cxNagent.T_PPID.IFX_MULBPSDX : 다중대역폭 스트리밍시, 대역폭별 파일 순서값.
cxNagent.T_PPID.IFX_TMBSRCDX : 다중대역폭 스트리밍시, 썸네일 이미지세트 순서값.
String 형 프로퍼티.
cxNagent.T_PPID.SFX_VODURL : 스트리밍할 동영상 파일 URL
cxNagent.T_PPID.SFX_IMGURL : 썸네일 이미지 디렉토리 URL
cxNagent.T_PPID.SFX_LICNKEY : SDK 라이센스 키값
|
|
setTimeout(r_conn:Double, r_recv:Double) |
서버와 접속 및 데이터 수신 타임아웃 시간을 설정한다. -1은 설정값을 변경하지 않는 인자값이다.
|
|
var thumbnailCount: Int |
서버에서 수신한 썸네일 이미지 갯수 프로퍼티 (get Type variable)
|
|
|
cx_serv_retv |
|
getMediaFuid()->String |
동영상 파일의 파일 Unique-ID 값. 썸네일 이미지 파일명 조합시 사용한다.
|
|
getMediaHeader()->cx_media_inf |
VOD 서버에서 쿼리된 동영상 파일 정보를 가져온다.
cx_media_inf class는 아래와 같은 프로퍼티를 가지고 있다.
i_type(미디어 파일 타입:정수), i_kbps(초당전송률:Killobits/sec), r_filesize(파일크기: 실수), i_duration(재생시간:정수), s_audio4cc(오디오 압축방식:문자열 / 기본값:null), s_video4cc(비디오 압축방식:문자열 / 기본값:null)
|
|
getMediaUri()->URL? |
암호화된 동영상 미디어 소스 URL을 가져온다.
|
|
getServVersion()->String |
나클립스 VOD 서버의 엔진 버전을 가져온다.
|
|
getThumbCount()->Int |
쿼리된 썸네일 이미지 갯수를 리턴한다.
|
|
getThumbName(i_dx: Int)->String |
i_dx 번째 썸네일 이미지 시간정보 문자열을 가져온다. getMediaFuid() 메서드의 리턴 문자열과 조합하여 디바이스 캐시에 저장된 실제 썸네일 이미지 파일명을 생성한다.
|
|
|
cxEtce |
|
static SECP(r_sec:Double)->useconds_t |
초단위 시간을 밀리초 단위 시간으로 변환한다.
|
|
static getLineCount(s_text:String, b_inc_blank:Bool,
b_inc_last_line:Bool)->Int
|
Text의 라인수를 가져온다.(b_inc_blank값이 true이면 문장의 행안에 글자가 없더라도 카운팅 한다. false 이면 행에 글자가 없으면 카운팅하지 않는다. b_inc_last_line 값이 true 이면 마지막 라인에 LF가 없더라도 행으로 간주하여 카운팅 한다.)
|
|
static shiftBytes(bs_array: inout [Byte], i_offset:Int) |
입력된 바이트 배열을 i_offset 갯수만큼 밀어(잘라)낸다.
i_offset 양수이면 오른쪽으로 밀어내며(오른쪽을 자름), 음수이면 왼쪽으로 밀어낸다.
|
|
static timeToSec(s_hour:String, s_min:String,
s_sec:String)->Int |
시간,분,초 숫자형 문자열을 입력하면 초단위 시간값을 리턴한다.
|
|
static StringToUrl(s_url:String, b_enc: Bool)->URL? |
문자열을 URL로 바꾼다. b_enc는 변환시 URL인코딩 여부를 지정.
|
|
|
|
|
|
cxEtce |
|
static isNilOrEmpty(_ s_var:String?)->Bool |
s_var 문자열이 nil 또는 Empty이면 참을 리턴한다.
|
|
static strcmp(_ s_a:String!,_ s_b:String!,_ b_ignore_case
:Bool=false)->Bool
|
문자열이 같은지 비교한다. (b_ignore_case 인수가 true 이면 대소문자 구분을 하지 않는다.)
|
|
|
cx_media_type |
|
cx_media_type(i_type:Int) |
cx_media_type 클래스 생성자. i_type 인자는 Audio/Video 파일 타입의 숫자값이다.
(i_type값은 cx_serv_retv 클래스 객체의 getMediaHeader().i_type 값이다.)
|
|
setType(i_type:Int) |
cx_media_type 클래스 객체의 Audio/Video 파일 타입의 숫자값을 입력 또는 변경한다. |
|
getType()->String |
입력된 Audio/Video 파일 타입의 숫자 값에 해당하는 미디어 타입 확장자를 리턴하다. |
|
getTypeDesc()->String |
입력된 Audio/Video 파일 타입의 숫자 값에 해당하는 미디어 타입 문자열을 리턴한다. |
|
5.데이터 타입별 확장목록 (Data Type Extension). |
|
extension String |
|
charAt(_ i_pt:Int)->Character |
문자열에서 i_pt 번째 문자를 가져온다.
|
|
indexOf(_ c_key:Character,_ i_start:Int = -1)->Int |
문자열에서 i_start 번째 부터 검사하여 c_key 문자를 찾는다.
|
|
indexOf(s_key:String)->Int |
문자열에서 s_key 문자열을 검색한다.
|
|
isNumeric()->Bool |
문자열이 숫자로만 이루어진 문자열인지 검사한다.
|
|
lastIndexOf(_ c_key:Character, i_start:Int = -1)->Int |
문자열에서 c_key 문자를 뒤에서 부터 찾는다. 이때 i_start값은 뒤에서 부터 시작되는 순서값.
|
|
shift(i_count:Int)->String |
문자열을 i_count 만큼 잘라낸다. i_count값이 양수이면 오른쪽, 음수이면 왼쪽을 자른다.
|
|
substr(i_start:Int, i_offset:Int = 0)->String |
문자열에서 i_start 부터 시작하여 i_offset 갯수만큼의 문자열을 가져온다.
|
|
substring(i_start:Int, i_end:Int = -1)->String |
문자열에서 i_start 부터 시작하여 i_end 이전 까지의 문자열을 가져온다.
|
|
trim()->String |
문자열에서 바깥쪽 Space를 제거하여 가져온다.
|
|
var doubleValue: Double |
숫자형 문자열이면 실수로 변환된 값을 가져온다. (get Type variable)
|
|
var numberParsed: Int |
문자열 에서 숫자형 문자만 뽑아 정수로 변환한 값을 가져온다. (get Type variable)
|
|
var numberValue: Int |
숫자형 문자열이면 정수로 변환된 값을 가져온다. (get Type variable)
|
|
|
extension URL |
|
getScheme()->String |
URL의 Scheme 값을 가져온다. Default 값은 Empty
|
|
getHost()->String |
URL의 Host 값을 가져온다. Default 값은 Empty
|
|
getPort()->Int |
URL의 Port 값을 가져온다. Default 값은 0
|
|
getPath()->String |
URL의 Path 값을 가져온다. Default 값은 Empty
|
|
getQuery()->String |
URL의 Query 값을 가져온다. Default 값은 Empty
|
|
|
extension Character |
|
var asciiValue: Int |
문자의 아스키 값을 가져온다. (get Type variable)
|
|
|
extension UInt8 |
|
var asciiValue: Int |
바이트의 아스키 값을 가져온다. (get Type variable)
|
|
|
extension Array where Element == Byte |
|
indexOf(bs_key:[Byte], i_from:Int=0)->Int |
바이트 배열에서 bs_key 배열을 i_from 번째부터 찾는다.
|
|
toString(_ s_encid:String.Encoding)->String |
바이트 배열을 문자열로 변환한다. s_encid는 문자열 인코딩 타입.
|
|
6. SDK 라이브러리 적용 프로그래밍 요약. |
1) Nagent 모듈 import. |
Nagent 프레임워크를 새로운 프로젝트에 추가하고, 추가된 프레임워크 모듈을 소스상에 추가(import)하여 cxNagent 클래스 객체를 생성한다. |
import Nagent
class ViewController UIViewController {
.....
let gx_nagent = cxNagent()
.....
|
2) 클래스 객체에 프로퍼티 입력. |
생성된 cxNagent 클래스 객체에 VOD 스트리밍을 위한 프로퍼티를 입력한다. |
Override func viewDidLoad(){
super.viewDidLoad()
....
let s_vodurl = "assp://vod.nexpoly.co.kr/media/1st_sample.mp4"
let s_imgurl = "cssp://www.nexpoly.co.kr/sample/"
if !gx_nagent.setProperty(s_name: cxNagent.T_PPID.SFX_VODURL ,v_value: s_vodurl ){ print("failed set - vodurl") }
if !gx_nagent.setProperty(s_name: cxNagent.T_PPID.SFX_IMGURL ,v_value: s_imgurl ){ print("failed set - imgurl") }
if !gx_nagent.setProperty(s_name: cxNagent.T_PPID.SFX_LICNKEY,v_value: FX_SDKLICN_KEY ){ print("failed set - licensekey") }
....
|
3) cxNagent 클래스의 이벤트 처리 등록. |
생성된 클래스 객체의 이벤트 처리 함수를 등록한다. 주의할 사항은 이벤트 처리함수는 별도의 자식 쓰레드(Child Thread)에서 실행된다는 점이다. 따라서 동영상 재생 및 썸네일 이미지를 이미지뷰 등에 디스플레이 할때는 DispatchQueue.main.async 루틴을 이용하여 메인 쓰레드로 복귀하여 실행하여야 한다는 점이다. |
....
gx_nagent.setEvent(eventName: cxNagent.T_XEVT.SFX_GetEncuri , action: self.runEvtGetEncuri) // 암호화된 스트리밍 URL 가져옴 완료 이벤트
gx_nagent.setEvent(eventName: cxNagent.T_XEVT.SFX_GetThumbs , action: self.runEvtGetThumbs) // 썸네일 이미지 저장완료 이벤트
gx_nagent.setEvent(eventName: cxNagent.T_XEVT.SFX_ReturnError, action: self.runEvtReturnError) // 에러 발생 이벤트
....
}
....
private func runEvtGetEncuri(option:Any?){
guard let z_ret = option as? T_RET else {return}
guard let z_url = cxEtce.StringToUrl(s_url: z_ret.s, b_enc: false) else {return}
DispatchQueue.main.async { // 메인 쓰레드에서 실행하여야 함.
self.playVideoOnAVplayer(z_url:z_url) // AVPlayer를 이용하여 동영상 소스 URL 스트리밍 처리.
}
}
|
4) 스트리밍 플레이 시작. |
cxNagent 클래스 객체의 prepareStream() 메서드를 실행하여 나클립스 VOD 스트리밍을 시작한다. prepareStream() 메서드가 실행되면, 클래스 객체는 아래와 같은 처리 루틴을 백그라운드 쓰레드에서 수행한다.
1> 클래스 객체는 나클립스 VOD 서버에 접속하여 암호화된 VOD 스트리밍 URL을 수신.
2> 스트리밍 URL을 수신완료 하면 GetEncuri 이벤트를 발생시키고 썸네일 이미지파일 쿼리 시작.
3> 만약 이미 썸네일 이미지가 디바이스 캐시에 저장되어 있으면 저장된 썸네일 파일의 업데이트 상황을 체크하여 Skip 또는 다운로드.
4> 썸네일 이미지 Skip 또는 다운로드가 완료되면 GetThumbs 이벤트 발생.
|
override func viewDidAppear(_ animated: Bool){
super.viewDidAppear(animated)
....
gx_nagent.prepareStream() //동영상 스트리밍 플레이 시작.....
....
}
|
|
| 경기도 고양시 덕양구 삼원로 83, 1030호(원흥동, 광양프런티어밸리6차 지식산업센터) 넥스폴리테크놀러지. | TEL: 031) 963-9035. Copyright (C) 2025 Nexpoly Technology Inc. All rights reserved.
|
|