티스토리 툴바


'2012/02'에 해당되는 글 4건

  1. 2012/02/29 미디어 서버 구축 프로젝트
  2. 2012/02/17 Tron 게임
  3. 2012/02/11 퍼포먼스를 위한 발악 (2)
  4. 2012/02/02 native 메소드 이름 규칙
  • 서버: 델파이
  • 클라이언트: "안드로이드 + ffmpeg" or "MS-Windows + ffmpeg"
     
어제 1차 개발일정을 마치고 프로젝트를 간략하게 정리해 봅니다.  모든 프로젝트를 정리해야지 하면서도 잘 안되는 군요 ^^;

이미 상용 미디어 서버가 시장을 장악한 상황에서 미디어 서버를 직접 개발하게 된 이유는 다음과 같습니다.
  • 실시간 방송 중 광고 송출
  • VOD 방송 중 배속 재생 등을 지원하는 미디어 서버 및 클라이언트 개발
  • VOD 방송 중 광고 송출
  • 통신사에서 RTSP를 막아버리고 있는 가 봅니다.  이것도 하나의 개발 이유

제 다른 포스트에서도 썼던 기억이 있지만, 현재 미디어 서버에서 제공하는 배속은 제약사항 때문에 고객의 니즈를 만족시키지 못하여, 직접 제작을 의뢰 받아서 제작 중 입니다.

아래는 실시간 방송 모듈 테스트 화면, 의뢰 받은 XX일보의 실시간 골프 방송입니다.  원본 영상의 해상도는 640*480 입니다. 




서버의 Class Diagram

[그림 1]
  • FFServer: 미디어 서버 클래스
  • FFConnection: 사용자의 컨넥션을 관리
  • MediaSourceList: 미디어서버를 통해 배포할 동영상의 소스
  • PackageBuffer: 동영상의 프레임 정보를 묶어서 관리
  • Package: 프레임의 묶음
  • 기타 클래스는 도면에서 생략하였음


클라이언트의 Class Diagram

[그림 2]
  • FFClient: 미디어 서버에 접속하여 동영상을 재상하는 클래스
  • State관련 클래스들: 클라이언트의 State Diagram 참고
  • StreamPlayer: 서버로부터 전송 받은 동영상 정보를 재생하는 클래스
  • 기타 클래스는 도면에서 생략하였음


클라이언트의 State Diagram

[그림 3]
  • 스마트폰의 특성상 네트워크가 불안정해질 수 있기 때문에 의도하지 않게 접속이 끊어졌을 경우에는 재접속하여 재생을 계속 이어가도록 했습니다.
 
저작자 표시 비영리 변경 금지

'프로젝트 > 기타 프로젝트' 카테고리의 다른 글

미디어 서버 구축 프로젝트  (0) 2012/02/29
Posted by 류종택

Tron 게임

etc 2012/02/17 07:26


초등학교 때였던가?  이게 영화가 있는 것도 모르고, 게임에 빠져들었던 적이 있었는데, PC에서 실행할 수 있는 프로그램이 있어서 올려봅니다.


기억이 참 새롭네요 ^^*
저작자 표시 비영리 변경 금지

'etc' 카테고리의 다른 글

TED - 8가지 성공의 비결  (0) 2012/04/24
Use the Magic Trackpad with your Windows PC  (0) 2012/03/06
Tron 게임  (0) 2012/02/17
퍼포먼스를 위한 발악  (2) 2012/02/11
LED Display  (0) 2012/01/18
SoundTouch 버그 수정  (0) 2012/01/18
Posted by 류종택
오래 전부터 습관이 된 탓에 and 조건을 분별할 때에는 항상 확률이 낮은 것부터 나열하도록 신경을 쓰고 있었습니다.  그러다가, 요즘 PC에서 그런 것이 과연 얼마나 퍼포먼스 향상에 도움이 될 까 궁굼해 졌습니다.  바로 테스트에 들어 갔습니다.

[소스 1]
procedure TForm1.Button1Click(Sender: TObject);
var
  Tick : Cardinal;
  Loop, a, b : integer;
begin
  Tick := GetTickCount;

  for Loop := 1 to 100000000 do begin
      a := Random(2);
      b := Random(100);
//      if (a = 1) and (b = 1) then Tag := Tag + 1;
      if (b = 1) and (a = 1) then Tag := Tag + 1;
  end;

  Caption := IntToStr(GetTickCount - Tick);
end;
11: 라인과 12: 라인이 오늘의 주인공입니다.  결과적으로 똑같은 두 문장의 속도 차이는 아래와 같습니다.
  • 11: 라인 평균 1200 ms 정도
  • 12: 라인 평균 730 ms 정도
and 문장에서는 앞에서 false가 판별되었을 경우 다음 조건을 검사하지 않기 때문에 확률이 낮은 것을 먼저 분별하면 성능에 도움이 됩니다.  or 에서는 반대로 확률이 높은 것부터 나열하는 것이 조금이나마 이득이 됩니다.

근래에는 PC의 성능이 워낙에 좋아졌기 때문에 일반적인 경우 퍼포먼스에 대한 고민을 많이 할 필요가 없었졌습니다.  하지만, 스마트폰, 게임 및 증권 시스템 트레이딩과 같이 반복 계산이 많은 프로젝트 등에서는 이런 작은 차이들이 엄청난 결과를 만들어 내기도 합니다.

그렇긴 해도 반복 횟수를 감안하면 상당한 뻘짓이네요 ^^; 
저작자 표시 비영리 변경 금지

'etc' 카테고리의 다른 글

Use the Magic Trackpad with your Windows PC  (0) 2012/03/06
Tron 게임  (0) 2012/02/17
퍼포먼스를 위한 발악  (2) 2012/02/11
LED Display  (0) 2012/01/18
SoundTouch 버그 수정  (0) 2012/01/18
아들 넘의 첫 번 째 게임 - 홀짝 맞추기  (0) 2012/01/17
Posted by 류종택
"native 메소드 이름은 대문자로 시작한다."  이것은 개인적인 규칙으로 자주 사용하지 않기에 잊어먹는 것을 방지하기 위해서 나를 위해서 쓰는 포스트입니다.

[소스 1]
	static {
		System.loadLibrary("libFrameBuffer");	
	}
	
	private static native int CreateObject();
	private static native int ReleaseObject(int handle);
	
	private static native void Clear(int handle);
	private static native void AddPackage(int handle, int framePackage);
	
	private static native int GetFrame(int handle);
	private static native void FreeFrame(int frame);

	private static native void SkipFrame(int handle);

	private static native boolean GetIsEmpty(int handle);
	private static native int GetPositon(int handle);
	
	
	private int _Handle = CreateObject();
	
	protected void finalize() throws Throwable {
		ReleaseObject(_Handle);
		
		super.finalize(); 
	}
	
	public void clear() {
		Clear(_Handle);
	}
[소스 1]은 델파이를 통해서 만들어진 클래스를 안드로이드로 포팅하기 위해서 C로 함수별로 클래스의 메소드를 구현하고, 이것을 다시 자바의 클래스로 래핑하는 과정에서 나온 소스입니다.

08: 라인과 28: 라인의 메소드 이름을 같게 할 수 없기 때문에 한 쪽에는 이름이 달라야 합니다.  이를 위해서 native 메소드는 대문자로 시작하면서 구별하고 있습니다.  특수 문자 또는 "jni" 등의 접두사를 붙일까 고민했었지만, 개인적으로 마음에 들지 않아서 위와 같이 결정하였습니다.


 
저작자 표시 비영리 변경 금지
Posted by 류종택