Live555는 RTSP 관련 기능을 쉽게 사용 할 수 있도록 도와주는 여러 클래스를 제공하는 오픈소스 라이브러리이다. 단, 이 라이브러리에는 미디어 데이터를 디코딩 하거나 인코딩 하는 기능은 없고, 단순히 수신, 전송과 관련 된 기능을 제공하니 미디어 데이터의 인,디코딩 기능을 이용하고 싶다면, FFmpeg이나 quick sync등의 다른 API를 이용해 해당 기능을 구현해야 한다.

 

이번 포스트에서는 Live555를 Visual Studio 2010에서 사용 할 수 있도록 빌드하는 과정을 설명할 예정이다.

 

먼저 빌드에 사용할 소스코드를 Live555에서 다운받아보자.

 

처음 Live555싸이트에 들어가면 위와 같은 화면이 보이는데 우리가 다운받아야 할 소스코드는 LIVE555 Streaming Media 이부분에 들어가 있다. 왼쪽 부분에 Live555  Media Server는 이 LIVE555 Streaming Media를 기반으로 해서 만들어진 콘솔 프로그램으로 로컬폴더의 파일을 읽어 RTSP로 전송하는 기능을 제공한다.

 

어쨋든 소스 코드는 Live555 Streaming Media 이 부분에 있으니 클릭해서 들어가보자

 

소스 코드 단락에 보면 .tar.gz 파일을 받으라고 되어 있는 here 부분을  누르면 소스코드, 샘플용 미디어 파일을 다운 받을 수 있는 링크로 이동한다.

 

 

 

뭐 이런 저런 파일들이 많이 있는데 그냥 live555-latest.tar.gz를 다운 받으면 되겠다. 참고로 Live555는  구버전의 소스코드를 제공하지 않고 가장 최신 버전의 소스코드만 다운 받을 수 있다. 이유는 모르겠다. 그냥 live555에서 그런다고 한다. 어차피 Live555의 LGPL라이선스 때문에 이 라이브러리를 활용하는 제품은 항상 최신버전의 Live555를 제공해야 하는 필요성도 있고하니.. 그냥 일단 최신버전의 소스코드를 다운 받자.

 

다운을 받아 소스코드를 압축 해제해 보면 소스폴더와 이런저런 파일들이 있다. make파일을 생성해 주는 bat파일도 있어서  것 같은데 이 포스트에서는 그냥 직접 Visual Studio 2010에서 프로젝트를 만들어가지고 빌드할 예정이다. (사실 내가 어떻게 make파일 쓰는지를 모름 ㅎㅎ)

 

따라서 일단 Visual studio 2010에서 솔루션을 하나 맹글자.

그리고나서 아래와 같이 소스코드를 담고 있는 폴더명을 따서 프로젝트를 추가해주자.

 

정적 라이브러리로 빌드할 거니까

윈도우 32 콘솔프로그램 -> 생성마법사에서 정적 라이브러리 체크

로 해서 정적 라이브러리 빌드용 파일을 만든다.

(미리 컴파일 된 헤더도 체크해제한다.)

 

취향에 맞게 DLL로 만들어도 뭐.. 무방하다.

 

 

 

아참.. 그 전에 일단 각 소스코드 폴더별로 간단히 설명을 해야 겠다.

 

 

먼저 Live555 에서 각종 기능을 제공하는 소스코드. 즉, 라이브러리로 빌드할 소스코드는

 

UsageEnvironment

BasicUsageEnvironment

groupsock

liveMedia

 

여기 들어 있는게 전부다.

이 폴더안에 들어 있는 소스코드는 정적라이브러리 빌드용 프로젝트로 빌드하면 되겠다.

그 외에

 

proxyServer

mediaServer

testProgs

 

는 콘솔 프로그램으로 Live555에서 만들어서 제공하는 프로그램의 소스코드이다.

따라서 이 소스파일들은 빌드할 때는 console프로그램으로 프로젝트를 만들어 빌드해야 한다.

 

WindowsAudioInputDevice에 들어 있는 소스코드는 정확히는 모르겠지만 윈도우 OS에 연결된 오디오 장비로부터 음성 데이터를 수신할 수 있도록 해주는 소스코드가 들어 있는 것 같다. 구지 빌드하지 않아도 된다.

 

어쨋든 아래와 같이 각 소스코드별로 프로젝트를 만들고 각 폴더안에 들어 있는 헤더와 소스코드를 몽창 넣어주자.

 

 

그 다음 각 폴더에 대해 아래와 같이 헤더의 위치를 찾을 수 있도록 Include path 를 지정해 준다.

포함시켜야 할 include path는 라이브러리용 소스코드에 들어 있는 헤더파일의 위치로 아래와 같다.

 

헤더파일 경로

$(SolutionDir)\BasicUsageEnvironment\include;

$(SolutionDir)\UsageEnvironment\include;

$(SolutionDir)\groupsock\include;

$(SolutionDir)\liveMedia\include;

 

이것으로 라이브러리의 빌드를 위한 설정은 모두 완료 되었다.

 

UsageEnvironment

BasicUsageEnvironment

groupsock

liveMedia

 

위 네가지 프로젝트를 모두 Debug모드 Release모드로 빌드하면, 다른 프로젝트에서도 이 라이브러리를 사용 할 수 있도록 lib파일이 생성된다. 빌드해 낸 이 라이브러리를 사용하기 위해서는 아래와 같이 헤더와 추가 종속성을 프로젝트 속성에서 지정해 주면 된다.

 

헤더파일 경로

$(SolutionDir)\BasicUsageEnvironment\include;

$(SolutionDir)\UsageEnvironment\include;

$(SolutionDir)\groupsock\include;

$(SolutionDir)\liveMedia\include;

 

라이브러리 패스

이전에 lib파일이 생성 된 폴더

 

추가종속성

liveMedia.lib
BasicUsageEnvironment.lib
groupsock.lib
UsageEnvironment.lib
wsock32.lib

 

유념 해야 할것은 추가 종속성에서 swock32.lib파일을 추가해 줘야 하는 것이다. 이 라이브러리는 소켓 동작과 관련된 기능을 제공하는 윈도우 기본 라이브러리로, 이 종속성이 있어야 프로그램이 정상적으로 빌드 된다.

 

 

Posted by 굿쟌
,

 

 

 gStreamer를 한번 써먹어 보겠다고 아웅다웅 한 10여일 정도를 gObject도 공부하고 glib도 공부하고 했는데, 아무래도 좀 무린것 같다. 윈도우 환경에서만 개발하고 리눅스써본거는 거의 한 2년전에 대학원에서 잠깐 써먹어본 것이 전부라 이 선수과목들을 배우는거는 커녕 윈도우에서 돌아가도록 빌드하는 것도 쉽지 않은 일이었다.

 

결국 깔끔하게 gStreamer는 포기 ㅋㅋ..

 

코덱이나 RTSP전송, 수신이나 다 한가지 라이브러리 내에서 사용 할 수 있다는 측면에서 gStreamer를 배워 놓으면 좋을것 같긴하지만, 아무래도 glib와 gObject를 기반으로하는 gStreamer를 사용하기에는 배워야 하는것이 너무 많아서 좀 무리였던 것 같다. 다음을 기약하며 일단은 대안으로 생각해 놨던, Live555 라이브러리를 이용하는 방법을 생각해 봐야겠다.

 

다행히 Live555도 LGPL을 이용하기 때문에 소스코드 수정만 안하면 소스코드 공개 없이 상용배포도 가능하다고 하고, 더군다나 gStreamer수준으로 복잡하지는 않아 좋은 것 같다. 그도 그럴것이 아무래도 Live555에는 코덱과 관련된 기능이 배제되어 있기 때문인데, H.264와 관련된 기능은 나중에 FFmpeg를 통해 구현하기로 하고, 일단은  RTSP의 송수신만 Live555로 구현하는 것을 목표로 해야겠다.

 

Posted by 굿쟌
,

gStreamer를 공부해서 뭘 만들어 보려고 의욕에 가득 찬 마음으로 gStremaer Application Development Manual을 찾아 열어 봤는데.. 젠장 선수 과목이 있다.

 

gStreamer는 크로스 플랫폼( 컴파일만 가능하면 리눅스에서도 돌아가고 윈도우에서도 돌아감), multi language binding (C로 짜놨어도 각 객체 타입간 관계만 알 수 있으면 인터프리터 언어 등 개발언어와 상관없이 가져다 쓸 수 있음) 이라는 특성을 구현하기 위해, C기반 객체지향 구조와 multi language binding을 지원하는 gLib라고 하는 플랫폼을 이용하여 구현했기 때문에 gStreamer를 공부하기 전에 이 gLib라고 하는 플랫폼을 공부해야 하는 필요성이 생겼다.

 

친절하게도 gStreamer매뉴얼에 gLib와 gLib에서 사용하는 gObject에 대해서 설명해 놓은 메뉴얼 싸이트를 링크해 놧는데 들어가보면, 대략 "gLib는 GTK+나 GNOME등에서도 이런 다중언어 바인딩, C를 기반으로 하는 객체지향 설계등을 반영하기 위해서 선택된 플랫폼으로 오픈 소스이다." 라는 설명과 함께 gLib가 어떻게 타입들을 정의하고 사용하는지에 대한 장대한 설명이 펼쳐진다. 물론 영어로.

 

즉, gStreamer를 이해하려면 최소한 그 기반에 깔려있는 gLib의 타입구조와 gObject를 생성하고, 소멸하는 정도는 이해하고 있어야 한다. 공부할게 또 늘었다. 세상 참 쉽게 되는게 없다.

Posted by 굿쟌
,