몇일 전에 계획했던대로 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을 사용하기 위해서는 현재 구조에서 변경이 있어야 하므로 일단은 보류..
기존에 클라이언트에서 영상 포맷을 분석 한 후 메타데이터를 분리하는 과정을 서버에서 하기로 했다. 결정한지는 오래됬는데 여차 바쁘다보니...
암튼.. 이런 결정을 한 계기는 서비스 특성상 서버가 네트워크 부하가 크고 CPU 는 팽팽 노는 현상이 발생 하기 때문에 서버의 중요기능인 트래픽 스로틀 기능을 메타데이터에 적용 할 때 활성 여부를 서버에서 수행하기 위함이다.
현재 구조는 재생 시작시 대부분의 영상 파일은 메타데이터를 가지고 있다. 파일 헤더와 인덱스 등이 그에 해당한다.
예를 들면 avi의 경우에는 인덱스와 데이터가 구분 되어 있으며 dshow 필터에서 초기 로딩시 인덱스에 접근하여 이를 로딩하는 과정을 거친다. 그런데 스토틀 기능이 최대 비트레이트 이상은 보내주지 않기 때문에 메타데이터가 커지면 초기 동영상 로딩이 느려진다는 단점이 있다.
이를 극복하기 위하여 클라이언트에서 메타데이터를 로딩 할 때 서버에서 이 사실을 알려주도록 구성이 되어있으나 클라이언트 판단을 서버가 전적으로 믿는 방식이므로 문제가 있다.
따라서 서버에서 동영상 정보를 스캔 할 때 메타데이터 정보 위치를 계산하여 저장 후 클라이언트가 데이터 요청시 메타데이터 영역을 요청한다면 스로틀을 끈 상태에서 최대 속도로 보내주도록 설계를 바꾸게 되었다.
기능의 특성상 서버 플러그인 방식으로 구현을 하는게 나을것 같긴 한데.. 기능 규모, 유지보수성등을 고려해서 좀 더 생각을 해보고..
댓글을 달아 주세요