안드로이드 클라이언트 제작을 위해 일단 ffmpeg를 안드로이드에서 사용하기 위해서
ndk로 컴파일을 하여 준비를 마쳤다.

ffmpeg를 ndk로 컴파일 하는 것이 제일 문제였는데 안드로이드펍에 올라온 글을 보고
쉽게 컴파일을 마칠 수 있었다.

다음은 구현할 기능을 리스트업 하고 설계에 들어가야겠다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/10/08 15:01 2011/10/08 15:01
사용자 삽입 이미지




















AnyVOD 정식을 릴리즈 합니다.

서버 사용법 :
  1. \server\x64\setting.ini 또는 \server\x86\setting.ini를 텍스트 에디터로 연다.
  2. setting.ini 내용을 적절히 수정한다.
    1. movie_dir : 서버가 동영상과 음악 파일을 스캔하는 위치
    2. movie_exts : 스캔 시 포함해야하는 동영상 또는 음악 파일 확장자 목록
    3. log_dir : 로그가 저장되는 위치
    4. db_dir : 데이터베이스 파일이 저장되는 위치
    5. analyser_dir : 동영상 분석기가 있는 위치
    6. nic : 서버 구동시 사용하는 랜카드 IP 주소
    7. listen_port : 서버 구동시 사용하는 포트 번호
    8. buffering_multiplier : 스트리밍 시 사용하는 속도 조절용 factor. 0을 지정하면 속도조절 기능을 끈다.
  3. AnyVODServer.exe를 실행한다.
  4. 실행이 되면 "start"를 입력한다.
  5. 도움말이 필요하면 "help"를 입력한다.
클라이언트 사용법 :
  1. client\settings.ini를 텍스트 에디터로 연다.
  2. settings.ini 내용을 적절히 수정한다.
    1. address : 접속할 서버 주소를 입력한다.
    2. port : 접속할 서버 포트를 입력한다.
  3. AnyVODClient.exe를 실행한다.
  4. 오른쪽 마우스 버튼 클릭 -> 로그인 클릭 -> 아래에 나열된 계정 정보 입력
서버툴 사용법 :
  1. server_tool\setting.ini를 텍스트 에디터로 연다.
  2. setting.ini 내용을 적절히 수정한다.
    1. server_address : 접속할 서버 주소를 입력한다.
    2. server_port : 접속할 서버 포트를 입력한다.
  3. AnyVODServerTool.exe를 실행한다.
  4. 아래에 나열된 계정 정보 입력

서버 툴과 클라이언트에서 서버로 로그인 시 계정 정보는 아래와 같습니다.

서버툴 : admin / 1111
클라이언트 : guest / 1111

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/06/23 15:10 2011/06/23 15:10
사용자 삽입 이미지




















RC-2 테스트가 끝나고 RC-3에 들어갑니다.
아마 이번 버전이 RC의 마지막이 될듯 합니다. 만약에 큰 문제가 발생하지 않으면
다음 릴리즈때는 정식버전이 릴리즈 될 예정입니다.

서버 툴과 클라이언트에서 서버로 로그인 시 계정 정보는 아래와 같습니다.

서버툴 : admin / 1111
클라이언트 : guest / 1111

소스 :

바이너리 :
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/05/30 11:30 2011/05/30 11:30
사용자 삽입 이미지





















RC-1 테스트가 끝나고 RC-2 에 들어갑니다.

서버 툴과 클라이언트에서 서버로 로그인 시 계정 정보는 아래와 같습니다.

서버툴 : admin / 1111
클라이언트 : guest / 1111

소스 :

바이너리 :
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/05/21 11:50 2011/05/21 11:50
사용자 삽입 이미지

약 두달간 개발 기간을 거쳐 클라이언트 부분을 모두 구현했습니다.
구현 목표 했던 것은 전부 구현 했기 때문에 릴리즈를 위해서 일주일간 버그 테스트에 들어갑니다.

릴리즈 후 다음 버전에 들어갈 기능을 리스트업해야겠습니다.

서버 툴과 클라이언트에서 서버로 로그인 시 계정 정보는 아래와 같습니다.

서버툴 : admin / 1111
클라이언트 : guest / 1111

소스 :

바이너리 :
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/05/11 17:24 2011/05/11 17:24
일단 메모용으로..

클라이언트 :
1. 단축키를 사용했을 경우 화면에 단축키 활성화 여부 출력(완료)
2. 화면에 간단한 동영상 정보와 재생 상황 출력(완료)
3. smi 자막 지원(완료)
4. ASS 자막지원(mkv와 같은 포맷에 내장된 것은 이미 구현 되어있지만 외부 파일일 경우 지원해야함)(완료)
5. 동영상 포맷에서 스트림이 여러개 존재 할 경우 재생 스트림을 고를 수 있도록 지원
6. http, rtsp등 표준 네트워크 스트리밍 재생 지원(ffmpeg에서 지원하지만 플레이어에서 주소를 입력하는 부분이 없으므로 이를 구현해야함)
7. bass_fx를 이용하여 몇가지 오디오 효과 적용(ex. normalizing)(완료)
8. s32bits 오디오 소스 재생지원(bass가 정수포맷은 16bits가 최대이므로 여기에 맞춰야함)(완료)

서버 :
1. 동영상 파일명에 유니코드 지원
2. smi와 같은 외부 자막을 클라이언트에서 요청 할 경우 전송 지원(완료)

일단 여기까지..

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/04/30 18:18 2011/04/30 18:18
사용자 삽입 이미지





















로컬 파일 재생 및 원격 파일 재생부분까지 구현 완료 했다.
처음에는 Qt에서 제공하는 QTcpSocket을 이용했는데 이를 여러 스레드에서 접근하여 사용하니 이를 지원하지 않았다. 동기화 문제는 아니고 QTcpSocket 자체에서 QTcpSocket를 생성한 스레드에서만 모든 오퍼레이션이 이루어지도록만 되어있다.

실제로 QTcpSocket를 생성한 스레드와 이를 사용하는 스레드간에 동기화 문제는 전혀 없는데도 QTcpSocket자체에서 이를 지원하지 않아 대략 난감..

그냥 표준 socket api를 이용해서 구현했다.
어차피 QtNetwork4.dll이라는걸 쓰는게 맘에 안들었어

이제 남은 것은 테스트를 통해 UI 불편사항과 버그잡고 불안정한 부분은 찾아서 안정화 시킨 다음에 릴리즈를 해야한다.

그리고 서버와 클라이언트에서 유니코드 지원 작업이 남았다.
대략 현재는 멀티바이트만 지원하므로 일부 동영상에서 파일 이름에 여러 종류의 언어가 섞여있으면 파일 목록을 제대로 못받아오는 경우가 생긴다.

멀티플랫폼을 고려해야하므로 wchar_t는 사용을 못한다. iconv등을 이용해서 UTF-8을 이용할 계획이다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/04/28 10:28 2011/04/28 10:28
사용자 삽입 이미지

몇일 전에 계획했던대로 ffmpeg,QT, SDL을 이용해서 플레이어 프로토타입을 만들었다.
QT와 SDL을 연동하던 부분이 꽤나 힘들었다.

SDL 자체의 문제인지 아니면 QT의 문제인지는 모르겠지만 전체화면 또는 최대화면으로 전환 할 때 SDL_SetVideoMode 내부에서 죽는 문제가 발생했다.

SDL 소스를 까보니 대략 화면이 전환 될 때 Windows에서 SDL의 드라이버 구현체중 하나인 ddraw의 surface가 lost되는 현상 때문 인것 같아보였다.

아무튼 그렇기 때문에 SDL_GetVideoMode를 이용해서 미리 오류가 발생할 상황을 체크 후 SDL_SetVideoMode를 이용해서 죽는 문제는 회피 했으나 만약에 오류가 나서 SDL_SetVideoMode 호출이 실패 할 경우 화면 크기가 맞지 않는 문제가 발생한다.

이로 인해 원래 전체화면 모드를 지원했지만 이 기능을 제거했다.

SDL 자체가 게임 또는 에뮬레이터 작성을 위해서 만들어진 것이라서 그런지 멀티미디어 프로그램을 만드는데는 별로 적합하지 않는것 같다.

일단 SDL 자체에서 마우스와 키보드 이벤트를 발생해주느라 SDL 드라이버에 따라서 가끔 SDL 자체가 마우스와 키보드를 독점하여 QT가 먹통이 되는 경우도 종종 있다.

아무튼 그러한 이유와 SDL 1.2가 오래된 라이브러리라서 요즘 대부분 지원하는 3D를 이용한 2D 가속을 지원해주지 않는 문제가 있어서 SDL 1.3으로 바꿀려고 했으나....

아직 정식 버전이 아니라서 그런지 1.2보다 더 문제가 많은것 같이 보였다.............

그러한 이유로 아직 1.3은 사용하지 못하고 문제를 완벽히 해결하기 위해서는 렌더링만 전용으로 해주는 라이브러리를 사용해야한다.

QT 내부에 OpenGL을 사용할 수 있는 Widget이 존재하긴 하지만 외부에서 직접 접근하여 화면에 렌더링은 못하고 Widget이 제공하는 paintGL 함수 내부에서만 렌더링이 가능하다.

QT의 OpenGL Widget을 사용하기 위해서는 현재 구조에서 변경이 있어야 하므로 일단은 보류..
SDL 1.3을 기다려보고 싶은데 언제 나올지는 미지수..

오픈소스 3D엔진을 알아봐야 할 것 같다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/03/31 03:12 2011/03/31 03:12
한동안 손을 놓았던 AnyVOD 클라이언트를 멀티플랫폼을 지원하기 위해 구상중이다.

현재 구상된건 UI는 Qt, 디코딩은 FFMPEG, 렌더링은 SDL을 이용할 계획이다.
데스크탑용을 완성 후 모바일용으로 포팅 예정이다.

할일없는 잉여이기 때문에 가능한 것이니 열심히 잉여력을 소진하여 만들어봐야겠다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/03/22 00:11 2011/03/22 00:11

AnyVOD 근황..

프로그래밍 : 2009/10/09 09:50
기존에 클라이언트에서 영상 포맷을 분석 한 후 메타데이터를 분리하는 과정을 서버에서 하기로 했다. 결정한지는 오래됬는데 여차 바쁘다보니...

암튼.. 이런 결정을 한 계기는 서비스 특성상 서버가 네트워크 부하가 크고 CPU 는 팽팽 노는 현상이 발생 하기 때문에 서버의 중요기능인 트래픽 스로틀 기능을 메타데이터에 적용 할 때 활성 여부를 서버에서 수행하기 위함이다.

현재 구조는 재생 시작시 대부분의 영상 파일은 메타데이터를 가지고 있다. 파일 헤더와 인덱스 등이 그에 해당한다.

예를 들면 avi의 경우에는 인덱스와 데이터가 구분 되어 있으며 dshow 필터에서 초기 로딩시 인덱스에 접근하여 이를 로딩하는 과정을 거친다. 그런데 스토틀 기능이 최대 비트레이트 이상은 보내주지 않기 때문에 메타데이터가 커지면 초기 동영상 로딩이 느려진다는 단점이 있다.

이를 극복하기 위하여 클라이언트에서 메타데이터를 로딩 할 때 서버에서 이 사실을 알려주도록 구성이 되어있으나 클라이언트 판단을 서버가 전적으로 믿는 방식이므로 문제가 있다.

따라서 서버에서 동영상 정보를 스캔 할 때 메타데이터 정보 위치를 계산하여 저장 후 클라이언트가 데이터 요청시 메타데이터 영역을 요청한다면 스로틀을 끈 상태에서 최대 속도로 보내주도록 설계를 바꾸게 되었다.

기능의 특성상 서버 플러그인 방식으로 구현을 하는게 나을것 같긴 한데.. 기능 규모, 유지보수성등을 고려해서 좀 더 생각을 해보고..
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/10/09 09:50 2009/10/09 09:50