๊ฐ๋ฐ ๊ฐ์ด๋
๐ขย ์๋ก์ด Kollus Docs ์ฌ์ดํธ์์ ์ต์ ๋ฌธ์๋ฅผ ํ์ธํ์ธ์!๋ณธ ๋ฌธ์๋ ๊ตฌ๋ฒ์ ์ด๋ฉฐ, ๋ ์ ํํ๊ณ ์ต์ ํ๋ ์ ๋ณด๋ ์๋ ์ ๊ท ๊ฒฝ๋ก์์ ํ์ธํ์ค ์ ์์ต๋๋ค. ๊ฒ์ ์ค๋จ ์๋ด: ์ด ๋ฌธ์๋ 2026๋ 6์ 30์ผ๊น์ง๋ง ์ ๊ณต๋ฉ๋๋ค. |
|---|
ย
์ด ๋ฌธ์๋ ์๋๋ก์ด๋ SDK๋ฅผ ์ด์ฉํ ๊ฐ๋ฐ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.ย
ย
SDK์ ํฌํจ๋ Library ์ค๋ช ย
SDK์๋ arm64-v8a, armeabi, armeabi-v7a, x86, x86_64๊ณ์ด์ Native Library์ Java Library๋ฅผ ํฌํจํฉ๋๋ค.ย
kollusplayer_sdk-debug.jar(๋ก๊ทธ๊ฐ ์๋ ๋ฒ์ /๊ฐ๋ฐ์ฉ)ย
kollusplayer_sdk-release.jar(๋ก๊ทธ๊ฐ ์๋ ๋ฒ์ /๋ง์ผ์ฉ)
ย
KollusStorageย
์๋์ ๊ฐ์ ์์ ์ ์ํํฉ๋๋ค.
SDK ์ธ์ฆ ์ฒ๋ฆฌ
์ปจํ ์ธ ์ ๋ณด ํ๋
์ปจํ ์ธ ๋ค์ด๋ก๋
์ปจํ ์ธ ์ญ์
์คํธ๋ฆฌ๋ฐ ์บ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ
ย
KollusStorage ์ฌ์ฉ๋ฒ
getInstance
KollusStorage๋ ์คํ ๋ฆฌ์ง๋น ํ๋๋ง ์์ฑ์ ํด์ผ ํ๋ฏ๋ก singleton api๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฝ๋ฌ์ค์ฑ์ ๊ฒฝ์ฐ Activity๋ฅผ ์์ํ BaseActivity์์ ์ด๊ธฐํ ๊ด๋ จ ์ฌํญ์ ์ํํ๊ณ ํ์ํ Activity๋ BaseActivity๋ฅผ ์์ํ์ฌ ์๋์ ์ด๊ธฐํํ ์ ์๋๋ก ํฉ๋๋ค.
Initializeย
public int initialize(String key, String expireDate, String packageName);
SDK ์ธ์ฆ์ ๋ด๋นํ๋ฉฐ ๋ฆฌํด๊ฐ์ ์๋์ ๊ฐ์ต๋๋ค.
ErrorCodes.ERROR_OK
ErrorCodes.ERROR_INVALID_KEY
ย ErrorCodes.ERROR_EXPIRED_KEYย
setDevice / setDeviceAsyncย
Syncํจ์ ASyncํจ์ ํ์ ์ ์คํธ๋ก์ง ๊ฒฝ๋ก์ player id๋ฅผ ์ค์ ํ๋ ํจ์์ ๋๋ค. setDeviceํจ์๋ก ์ด๊ธฐํ๋ฅผ ํด๋ 100ms์ ๋ ๊ฑธ๋ฆฌ๋ฏ๋ก setDeviceAsyncํจ์๋ณด๋ค setDeviceํจ์๋ก ์ด๊ธฐํ ํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.ย
public int setDevice(String storagePath, String deviceSha1, String deviceGUIDMd5, boolean bTablet);ย
public void setDeviceASync(String storagePath, String deviceSha1, String deviceGUIDMd5, boolean bTablet, OnKollusStorageDeviceListener listener);ย
finishย
KollusStorage๋ฅผ ์์์ ํ์ํ๋ ํจ์๋ก ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ์คํ ๋ฆฌ์ง ๊ฒฝ๋ก ๋ฅผ ๋ฐ๊พธ๊ณ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. ๊ฒฝ๋ก๋ฅผ ๋ฐ๊พธ๊ณ ์ ํ ๊ฒฝ์ฐ finishํ 1~3๋ฒ ์ฌํญ์ ์ํํ๋ฉด ๋ฉ๋๋ค.
ย
๋ค์ด๋ก๋ ๋ฆฌ์คํธ ๊ฐ์ ธ์ค๊ธฐย
ArrayList<KollusContent> contentsList = kollusStorage.getDownloadContentList();ย
ย
๋ค์ด๋ก๋ ์์
ย
ย ๋ค์ด๋ก๋ ์ํฉ์ ์ธ์งํ๊ธฐ ์ํด์๋ registerOnKollusStorageListener๋ก ๋ฑ๋กํด์ผ ํฉ๋ ๋ค. ๋ ์ด์ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ unregisterOnKollusStorageListener๋ก ํด์ ํฉ๋๋ค.
public interface OnKollusStorageListener {
void onComplete(int index);
void onProgress(int index, int percent);ย
void onError(int index, int errorCode);
}
load
public int load(String path, String extraDrmParam, KollusContent content);
๋ฆฌํด๊ฐ์ด ์์์ด๋ฉด ์๋ฌ ์ํฉ์ผ๋ก ErrorCodes์ ๊ฐ์ ํ์ธํ์๊ธฐ ๋ฐ๋๋๋ค.
path : ๋ค์ด๋ก๋ํ ์ปจํ ์ธ ๊ฒฝ๋กย
extraDrmParam : DRM Callback์ ์ถ๊ฐ ํ๋ผ๋ฉํฐ. ์๋ ๊ฒฝ์ฐ null๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.ย
โป loadํจ์ ๋์์ ์ํํ ์ ์์ผ๋ฏ๋ก ์ฌ๋ฌ ํ์ผ์ ๋ค์ด๋ก๋ ํ์ค ๊ฒฝ์ฐ ํ ์ปจํ
์ธ load๊ฐ ์๋ฃ ํ์ ๋ค์ ์ปจํ ์ธ load๋ฅผ ํ์๊ธฐ ๋ฐ๋๋๋ค.
ย
download
ย public int download(String mediaContentKey);
๋ฆฌํด๊ฐ์ด ์์์ด๋ฉด ์๋ฌ ์ํฉ์ผ๋ก ErrorCodes ์ ๊ฐ์ ํ์ธํ์๊ธฐ ๋ฐ๋๋๋ค.
ย โป downloadํธ์ถ ์ ์ content.getFileSize๋ฅผ ํธ์ถํ์ฌ ๋จ์ ์๋ ๋์คํฌ ์ฉ๋์ด ํ์ผ ํฌ๊ธฐ+150MB๋ณด๋ค ์ปค์ผ ํฉ๋๋ค. ๋ค์ด๋ก๋ ํ ๋จ์ ์๋ ์ฉ๋์ด 150MB์ดํ (OS๋ฐ๋ผ ๋ค๋ฅด์ง๋ง ์์ ์ ์ผ๋ก 150M์์ค์)์ด๋ฉด ๋์คํฌ ์ฐ๊ธฐ๋ฅผ ํ ์ ์์ด์ ๊ธฐ ์กด ์ปจํ ์ธ ๋ฅผ ์ฌ์ฉ์ ํ ์ ์์ ์๋ ์์ต๋๋ค.
ย ย
๋ค์ด๋ก๋ ์ทจ์
ย public int unload(String mediaContentKey);
๋ค์ด๋ก๋ ์ทจ์๋ฅผ ์ํ์ค ๊ฒฝ์ฐ ๋ฏธ๋์ด ์ปจํ ์ธ ํค๋ก unload ๋ฅผ ํ๋ฉด ๋ฉ๋๋ค.
ย
๋ค์ด๋ก๋ ์ญ์ ย
public int remove(String mediaContentKey);
๋ค์ด๋ก๋ ์ญ์ ๋ฅผ ์ํ์ค ๊ฒฝ์ฐ ๋ฏธ๋์ด ์ปจํ ์ธ ํค๋ก remove ๋ฅผ ํ๋ฉด ๋ฉ๋๋ค.
ย
์ปจํ ์ธ ์ฌ์ย
์ปจํ ์ธ ์ฌ์
ํ๋ ์ด์ด ์์ฑย
public MediaPlayer(Context context, KollusStorage storage, int port);ย
๊ฐ์ข ๋ฆฌ์ค๋ ๋ฑ๋กย
ํ๋ ์ด์ด์์ ๋ฐ์ํ๋ ๊ฐ์ข ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ธฐ ์ํด์ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
์ ์ด๋ ์๋์ ๋ฆฌ์ค๋๋ ๋ฑ๋ก์ ํด์ผ ํฉ๋๋ค.
OnPreparedListenerย
OnCompletionListener
OnErrorListener
OnVideoSizeChangedListenerย
ํ๋ ์ด์ด ๊ด๋ จ ๋ฆฌ์ค๋๋ ์๋์ ๊ฐ์ต๋๋ค.ย
์ฌ์ ์ค๋น๊ฐ ์๋ฃ๋ฅผ ์๋ต๋ฐ๋ ๋ฆฌ์ค๋
setOnPreparedListener(OnPreparedListener listener);
public interface OnPreparedListener{
void onPrepared(MediaPlayer mp);
}์ฌ์ ์๋ฃ ์ฌ๋ถ๋ฅผ ์๋ต๋ฐ๋ ๋ฆฌ์ค๋
setOnCompletionListener(OnCompletionListener listener);ย
public interface OnCompletionListener{
void onCompletion(MediaPlayer mp);
}์๋ฌ ๋ฐ์ ์ ์๋ต๋ฐ๋ ๋ฆฌ์ค๋
ย setOnErrorListener(OnErrorListener listener);ย
public interface OnErrorListener{
boolean onError(MediaPlayer mp, int what, int extra);
}์ํฉ์ ๋ง๋ ์ ๋ณด๋ฅผ ์๋ต๋ฐ๋ ๋ฆฌ์ค๋
ย setOnInfoListener(OnInfoListener listener);ย
public interface OnInfoListener{
boolean onInfo(MediaPlayer mp, int what, int extra); void onBufferingStart(MediaPlayer mp);
void onBufferingEnd(MediaPlayer mp); void onFrameDrop(MediaPlayer mp);
void onDownloadRate(MediaPlayer mp, int downloadRate);
void onDetectBandwidthList(MediaPlayer mp, List<BandwidthItem> list); void onChangedBandwidth(MediaPlayer mp, BandwidthItem item);
}widevine ๋ฑ DRM ๊ด๋ จ ๋ฆฌ์ค๋
void setOnCencDrmListener(OnCencDrmListener listener);ย
public interface OnCencDrmListener{
void onProxyError(int nErrorCode, String strErrorMessage);
}seek ์๋ฃ ์ฌ๋ถ๋ฅผ ์๋ต๋ฐ๋ ๋ฆฌ์ค๋
ย setOnSeekCompleteListener(OnSeekCompleteListener listener);ย
public interface OnSeekCompleteListener{
public void onSeekComplete(MediaPlayer mp);
}์ปจํ ์ธ resolution ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ์๋ต๋ฐ๋ ๋ฆฌ์ค๋
ย setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener);
ย ์ต์ด resolution ์ ๋ณด๋ฅผ ๋ฐ์ ๋๋ ์ฌ์ฉ๋ฉ๋๋ค.
public interface OnVideoSizeChangedListener{
public void onVideoSizeChanged(MediaPlayer mp, int width, int height);
}ํด๋น ์๊ฐ์ ์๋ง์ ์๋ต๋ฐ๋ ๋ฆฌ์ค๋
ย setOnTimedTextListener(OnTimedTextListener listener);ย
public interface OnTimedTextListener{
public void onTimedText(MediaPlayer mp, String text);
public void onTimedImage(MediaPlayer mp, byte[] image, int width, int height);
}์ธ๋ถ ๋ชจ๋ํฐ๋ฅผ ๊ฐ์งํ๋ ๋ฆฌ์ค๋
ย setOnExternalDisplayDetectListener(OnExternalDisplayDetectListener listener);ย
public interface OnExternalDisplayDetectListener{
public void onExternalDisplayDetect(int type, boolean plugged);
}์ง๋๋ฅ ๋ฐ์ดํฐ๊ฐ ์๋ฒ์ ์ฌ๋ผ๊ฐ ๋ ์ฃผ๊ณ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ ๋ฆฌ์ค๋
ย registerKollusPlayerLMSListener(KollusPlayerLMSListener listener);ย
public interface KollusPlayerLMSListener {
/**
์ง๋๋ฅ ์ ์๋ฒ์ ์ ์กํ์ ๋ ๊ด๋ จ ์ ๋ณด
@param request ์๋ฒ์ ์ ์กํ ๋ฉ์ธ์ง
@param response ์๋ฒ์์ ์๋ต ๋ฐ์ ๋ฉ์ธ์ง
*/
void onLMS(String request, String response);
}unregisterKollusPlayerLMSListener(KollusPlayerLMSListener listener);
ย
๋ถ๋งํฌ ๊ด๋ จ ๋ฆฌ์ค๋ย
setKollusPlayerBookmarkListener(KollusPlayerBookmarkListener listener);ย
public interface KollusPlayerBookmarkListener {
/**
* ๊ฐ์ฌ์ฉ ๋ถ๋งํฌ๋ ์ฌ์ฉ์ ๋ถ๋งํฌ๊ฐ ์์ ๊ฒฝ์ฐ ๋ฆฌ์ค๋ ๋ฉ๋๋ค.
* @param bookmark ๋ถ๋งํฌ ๋ฆฌ์คํธ
* @param bWritable false ์ธ ๊ฒฝ์ฐ ์ฌ์ฉ์ ๋ถ๋งํฌ๋ฅผ ํ ์ ์๋ ์ปจํ
์ธ ์
๋๋ค.
*/
void onBookmark(List<KollusBookmark> bookmark, boolean bWritable);
/**
* ๋คํธ์ํฌ ์ค๋ฅ, JSON ๋ฐ์ดํฐ ํ์ฑ ์ค๋ฅ, JSON error ํ๋๊ฐ 0 ์ด ์๋ ๋ ๋ฐ์ํฉ๋๋ค.
*/
void onGetBookmarkError(int nErrorCode);
/**
* ๋ถ๋งํฌ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ฐฑ์ ๋์์ ๋ ๋ฆฌ์ค๋๋ฉ๋๋ค.
* ์ถ๊ฐ ์ก์
ํ ๋คํธ์ํฌ ์ํฉ์ ๋ฐ๋ผ ์ค๋ ์๊ฐํ์ ๋ฆฌ์ค๋๋ ์ ์์ต๋๋ค.
* @param position ๊ฐฑ์ ํ ์ด๋จ์ ์์น
* @param bUpdated ๊ฐฑ์ ์ฑ๊ณต ์ฌ๋ถ
*/
void onBookmarkUpdated(int position, boolean bUpdated);
/**
* ๋ถ๋งํฌ๊ฐ ์ญ์ ๋์์ ๋ ๋ฆฌ์ค๋๋ฉ๋๋ค.
* ์ญ์ ์ก์
ํ ๋คํธ์ํฌ ์ํฉ์ ๋ฐ๋ผ ์ค๋ ์๊ฐํ์ ๋ฆฌ์ค๋๋ ์ ์์ต๋๋ค.
* @param position ์ญ์ ํ ์ด๋จ์ ์์น
* @param bDeleted ์ญ์ ์ฑ๊ณต ์ฌ๋ถ
*/
void onBookmarkDeleted(int position, boolean bDeleted);
}Emulator ์์ ์ฌ์์๋ ์ ๋ฐ์ํ๋ ๋ฆฌ์ค๋
ย setEmulatorCheckerListener(EmulatorCheckerListener listener);ย
public interface EmulatorCheckerListener {
public void onRunningEmulator();
}ย
๋น๋์ค ์ถ๋ ฅ ํ๋ฉด ์ค์
๋น๋์ค ์ถ๋ ฅ ํ๋ฉด์ ์ค์ ํ๋ ํจ์์๋ ์๋์ ๊ฐ์ด ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค.ย
public void setSurface(Surface surface);ย
public void setDisplay(SurfaceHolder sh);
ย
์ปจํ ์ธ ๊ฒฝ๋ก ์ค์ ย
๋น๋์ค ๊ฒฝ๋ก ์ค์ ํ๋ ํจ์์๋ ์๋์ ๊ฐ์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ ์ปจํ ์ธ
public void setDataSourceByUrl(String path, String extraDrmParam);
path : ๋ฏธ๋์ด ๊ฒฝ๋ก
extraDrmParam : Play Callback ์ถ๊ฐ ํ๋ผ๋ฉํฐ. ์๋ ๊ฒฝ์ฐ null ์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
ย ๋ค์ด๋ก๋ ์ปจํ ์ธ
public void setDataSourceByKey(String mediaContentKey, String extraDrmParam);
mediaContentKey: ๋ค์ด๋ก๋๋ ๋ฏธ๋์ด ์ปจํ ์ธ ํค
extraDrmParam : DRM Callback ์ถ๊ฐ ํ๋ผ๋ฉํฐ. ์๋ ๊ฒฝ์ฐ null ์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
ย
์ฌ์ ์ค๋น ์๋ฃ
public void prepareAsync();
prepareAsync ๋ฅผ ํธ์ถํ๋ฉด ์ปจํ ์ธ ์ฌ์ ์ค๋น๊ฐ ์๋ฃ๋์์ ๋ OnPreparedListener ์ onPrepared ๊ฐ Listen ๋ฉ๋๋ค. ์ด๋๋ถํฐ ์ปจํ ์ธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ณ ์ฌ์ํ ์๋ ์์ต๋๋ค.
๋ง์ฝ์ ์ด์ด๋ณด๊ธฐ๋ฅผ ์ํ์๋ฉด start ์ ์ seekTo ๋ seekToExact ๋ฅผ ์ํํ๋ฉด ๋ฉ๋๋ค.
onPrepared(MediaPlayer mp)๊ฐ ๋ฐ์ํ์ ๋
getKollusContent(KollusContent content)๋ฅผ ํธ์ถํ์ฌ ์ปจํ ์ธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์คํฌ๋ฆฐ ์ท ์ ๋ณด๋ ์๋์ ๊ฐ์ด ์ป์ ์ ์์ต๋๋ค.
String screenShotPath = content.getScreenShotPath();
Naming rule์ ํ์ผ๋ช .{width}x{height}x{count}.ํ์ฅ์์ ๋๋ค.
โป Count์์ ์ 3์ฅ์ ๋ฌด์๋ฏธํ ๊ฐ์ ๋๋ค.
์ด์ด๋ณด๊ธฐ๋ฅผ ์ํ ์ ์๋์ ํจ์ ์ค ํ๋๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
mMediaPlayer.seekTo(int msec); //I-Frame๋จ์ seek
mMediaPlayer.seekToExact(int msec); //์๊ฐ ๋จ์ seek
ย
์ฌ์ ์ข ๋ฃ
์ฌ์ ์ข ๋ฃ๋ฅผ ์ํ์๊ฑฐ๋ OnCompletionListener์ onCompletion๋ฅผ ๋ฐ์์ ๊ฒฝ์ฐ ์๋์ ํจ์๋ฅผ ์์ฐจ์ ์ผ๋ก ํธ์ถํ์๋ฉด ๋ฉ๋๋ค.
public void stop();
public void release();
ย
๋ถ๋งํฌ ๊ด๋ฆฌย
๋ถ๋งํฌ ๊ด๋ฆฌ๋ ์ฌ์ ์ค์ ์ํํ ์ ์์ผ๋ฉฐ KollusPlayerBookmarkListener๋ฅผ ๋ฑ๋กํ์ ๋ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
ย
์ถ๊ฐ/์ญ์ ๋ ๋คํธ์ํฌ๋ฅผ ํตํ ์์ ์ด์ด์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ผ๋ฏ๋ก ํด๋น ํจ์ ํธ์ถ ํ ๊ณน๋ฐ๋ก UI์์ ์ ํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
๋ถ๋งํฌ ๋ฆฌ์คํธ ๊ฐ์ ธ์ค๊ธฐ
onBookmark๊ฐ ๋ฆฌ์ค๋ ๋์์ ๋ ๋ถ๋งํฌ ์ ๋ณด์ ์ถ๊ฐ/์ญ์ ๊ฐ๋ฅ์ฌ๋ถ๊ฐ ์ ์ ์์ต๋๋ค.ย
๋ถ๋งํฌ ์ถ๊ฐ ๋ฐ ๊ฐฑ์ ย
public void updateKollusBookmark(int position, String label); position : ๋ถ๋งํฌํ ์์น์ ๋ฐ๋ฆฌ์ด
label : ๋ถ๋งํฌํ ์์น์ ํ์ดํ. ์์ผ๋ฉด โโ๋ฌธ์๋ฅผ ์ฃผ์๋ฉด ๋ฉ๋๋ค.
updateKollusBookmark๋ฅผ ํธ์ถํ๋ฉด onBookmarkUpdated๊ฐ ๋ฆฌ์ค๋ ๋ฉ๋๋ค.
โป ์๋ก์ด ํญ๋ชฉ์ด๋ฉด ์ถ๊ฐ๋๊ณ ๊ธฐ์กด ํญ๋ชฉ์ด๋ฉด ๊ฐฑ์ ์ด ๋ฉ๋๋ค.
๋ถ๋งํฌ ์ญ์
public void deleteKollusBookmark(int position);
position : ์ญ์ ํ ๋ถ๋งํฌ ๋ฐ๋ฆฌ์ด
deleteKollusBookmark๋ฅผ ํธ์ถํ๋ฉด onBookmarkDeleted๊ฐ ๋ฆฌ์ค๋ ๋ฉ๋๋ค.
ย