그리드 기술이 적용된 다운로드
Android는 aar 형태의 라이이브러리로 제공됩니다.
현재 iPhone 은 라이이브러리로 제공하지 않습니다.
그리드 기술이 적용된 모바일 컨텐츠 다운로드, "다운로드" 와 다르게 컨텐츠를 다운로드 도중 컨텐츠 재생이 가능하며 SEEK 를 지원합니다.
다운로드 도중 컨텐츠는 임시 파일(.part)의 형태로 진행되며, 다운로드 완료시 원래 파일명으로 변경됩니다.
SEEK, 배속, 이어보기, 화면 밝기, 볼륨조절 등이 지원되는 실시간 컨텐츠 재생합니다.
플레이어 앱은 iCoxs에서 제공하며, 라이브러리를 사용하실때는 aar 로 제공됩니다.
거의 모든파일에 플레이가 가능합니다.
*표는 그리드 사용시 필수항목입니다.
스토리지가 리눅스 일 경우 mserver (32bit, 64bit), Windows 일 경우 mserver.exe 로 제공되며, HTTP 프로토콜을 지원하는 파일 서버 모듈 입니다.
이미 파일서버에 HTTP 서비스 중일경우(nginx, apache 등), mserver 를 설치 하지 않으셔도 됩니다.
mserver.cnf 의 설정파일을 지원합니다. 설정파일에 id, password를 입력하여 인증을 사용할 수 있습니다.
다운로드 어플에 장착하여 다운로드 시작은 _startDown() 호출하고, 다운로드 상태는 _getDownInfo() 또는 _getDownInfo2(), 다운로드 중시에는 _stopDown()를 호출합니다.
앱의 스프레쉬, 아이콘 등을 작성하셔서 iCoxs에 전달하시고, 앱이 테스트 완료된 후에 앱 스토어에 등록 하시면 됩니다.
1. 파일서버에서 mserver 을 실행하여 주십시오. 또는 apache, nginx 등을 통해서 HTTP가 가능한지 확인하세요.
2. Android 어플에 mgrid.aar를 장착하십시오.
3. 내부 테스트 후 앱 스토어에 등록하세요.
그리드 모듈과의 통신은 JSON 으로 되어 있습니다. JSON의 Key-Value 모두 String 형태로("xxx":"yyyy") 로 작성하십시오.
// 아래 4개를 추가한다.
implementation files('libs/mgrid-release-2106010.aar') // 다운로드
implementation files('libs/mstreamgrid-release-2106010.aar') //스트리밍
implementation files('libs/libmplayer-release-2107050.aar') //플레이어
implementation 'com.google.android.gms:play-services-cast-framework:20.1.0' //PIP 라이브러리
protected Downloader mDownloader = null;
...
...
mDownloader = Downloader.getInstance("demo"); // 사이트 아이디를 입력하세요.
String downloadJson = makeDownloadJson3();
mDownloadGridThread = new DownloadGridThread(1, downloadJson); // 그리드 다운로드 시작 0: 다운로드, 1: 다운플러스
mDownloadGridThread.isThreadStop = false;
mDownloadGridThread.start();
...
...
상세한 사항은 데모프로그램을 참조하세요.
private class DownloadGridThread extends Thread {
public boolean isThreadStop = false;
public boolean isSuspend = false;
private int mDownType = 0;
private String mDownJsonStr = "";
public DownloadGridThread(int downType, String jsonStr) {
mDownType = downType;
mDownJsonStr = jsonStr;
Log.i(TAG, "create Download Thread START");
}
@Override
public void run() {
final int startErr = startDownload();
if( startErr != 0) { //-1 일때는 파일이 있다.
Log.e(TAG, "Download Thread run error");
downloadJsonString = "";
runOnUiThread(new Runnable() { public void run() {
if (startErr == -1) {
Toast.makeText(getApplicationContext(), "파일이 존재합니다.", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(), "에러발생 Code=" + startErr, Toast.LENGTH_SHORT).show();
}
} });
return;
}
while (!isThreadStop) {
if (isSuspend) continue;
if (isThreadStop) break;
final String infoJsonString = mDownloader.getDownInfo();
//Log.d(TAG, infoJsonString);
runOnUiThread(new Runnable() { public void run() {
showDownInfoString(infoJsonString);
//Toast.makeText(BaseActivity.this , debugMessage, Toast.LENGTH_SHORT).show();
} });
int state = getStateCode(infoJsonString);
if (!(state == 1 || state == 2)){
break;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
Log.e(TAG, "run:" + e.getMessage());
}
} //end while
Log.i(TAG, "download thread STOP~~");
if (mDownloader != null)
mDownloader.stopDownload();
final String infoJsonString = mDownloader.getDownInfo();
Log.d(TAG, infoJsonString);
runOnUiThread(new Runnable() { public void run() {
showDownInfoString(infoJsonString);
} });
}
public void resumeDownload(){
if (mDownloader != null)
mDownloader.resumeDownload();
}
public void pauseDownload(){
if (mDownloader != null)
mDownloader.pauseDownload();
}
private int startDownload(){
Log.d(TAG, "!!!!!!!!!!! downloader !!!!!!!!! START" + this.mDownType);
try{
mDownloader = Downloader.getInstance("demo");
Log.d(TAG, "!!!!!!!!!!! downloader !!!!!!!!! 2222222");
if (mDownloader == null){
Log.d(TAG, "downloader object is null");
return -1;
}
}catch (Exception e){
e.printStackTrace(); //오류 출력(방법은 여러가지)
throw e; //최상위 클래스가 아니라면 무조건 던져주자
}
Log.d(TAG, "!!!!!!!!!!! downloader !!!!!!!!! 33333");
downloadJsonString = mDownloader.startDownload(mDownType, mDownJsonStr);
Log.d(TAG, "return startDownload:: " + downloadJsonString);
// error code
// return json string
// 예제 : {"err":0, "localfile": "/storage/emulated/0/Download/1.mp4", "subtitle": "/storage/emulated/0/Download/1.smi"}
// err 이 0이면 정상, startdownload return error code 참조
// Ok(0), ErrAlreadyFileExist(-1), ErrParameter(-2), ErrWrite(-3), ErrSpaceLack(-4), ErrDirectoryError(-5), ErrWorking(-6);
try {
JSONObject obj = new JSONObject(downloadJsonString);
int errCode = (int) obj.getInt("err");
if (obj.has("localfile")){
ContentPath = obj.getString("localfile");
}
if (obj.has("url")){
ContentPath = obj.getString("url");
}
// ContentPath = "http://127.0.0.1:11120/00fbaefba9243e682f094689ccd397ef_2284420818.avi";
Log.d(TAG, "ContentPath="+ ContentPath + " errCode="+ errCode);
return errCode;
} catch (JSONException e) {
e.printStackTrace();
return -99;
}
}
private int executePlayer(){
return 0;
}
}
1. smmgr.exe 설치시에 silent 옵션은 /VERYSILENT /SUPPRESSMSGBOXES 사용하십시오.
모듈 / OS | Windows | Linux | Android | Mac |
서버 모듈 | mserver_setup.exe | mserver-linux.zip | ||
다운로드 라이브러리 | libmgrid.dll | libmgrid.aar mstreamgrid.aar | libmgrid.dylib | |
피어 모듈 | smmgr_setup.exe | |||
DEMO 프로그램 | MGridDemo.zip | MyGrid_Android.zip | Mac_Demo.zip | |
플레이어 라이브러리 | libmplayer.aar libvlc.aar |