1. 程式人生 > >omnimeeting配置全過程

omnimeeting配置全過程

最近的一個專案,做一個流媒體伺服器,考慮到要用到H.264和G.711編碼,調研使用omnimeeting方案,omnimeeting很早就出現了,以至於和它匹配的很多東西都跟新到新的版本,不能使用了,比如ffmpeg都跟新到0.10版本了,但是和omnimeeting配套使用只能是0.4.9版本以前的。

開源專案完全符合你的要求:Omnimeeting
音視訊採用了
ffmpeg
影象處理使用了opencv

網路協議採用了live555

Omnimeeting是一個多平臺的C++ 視訊會議程式,能通過RTSP協議做到實時的攝像/音訊流傳輸,支援人臉識別和跟蹤提供I轉換/傳送全方點陣圖像的API。

一、       

介紹

Live555是一個為流媒體提供解決方案的跨平臺的C++開源專案,它實現了對標準流媒體傳輸協議如RTP/RTCPRTSPSIP等的支援。Live555實現了對多種音視訊編碼格式的音視訊資料的流化、接收和處理等支援,包括MPEGH.263+DVJPEG視訊和多種音訊編碼。同時由於良好的設計,Live555非常容易擴充套件對其他格式的支援。目前,Live555已經被用於多款播放器的流媒體播放功能的實現,如VLC(VideoLan)MPlayer

liveMedia專案的原始碼包括四個基本的庫,各種測試程式碼以及IVE555 Media Server

四個基本的庫分別是UsageEnvironment&TaskScheduler

groupsockliveMediaBasicUsageEnvironment

UsageEnvironment TaskScheduler類用於事件的排程,實現非同步讀取事件的控制代碼的設定以及錯誤資訊的輸出。另外,還有一個HashTable類定義了一個通用的 hash表,其它程式碼要用到這個表。這些都是抽象類,在應用程式中基於這些類實現自己的子類。

groupsock類是對網路介面的封裝,用於收發資料包。正如名字本身,Groupsock主要是面向多播資料的收發的,它也同時支援單播資料的收發。Groupsock定義了兩個建構函式

Groupsock(UsageEnvironment& env, struct in_addr const& groupAddr,

         Port port, u_int8_t ttl);

Groupsock(UsageEnvironment& env, struct in_addr const& groupAddr,

          struct in_addr const& sourceFilterAddr, Port port);

前者是用於SIMsource-independent multicast)組,後者用於SSMsource-specific multicast)組。groupsock庫中的Helper例程提供了讀寫socket等函式,並且遮蔽了不同的作業系統之間的區別,這是在 GroupsockHelper.cpp檔案中實現的。

liveMedia庫中有一系列類,基類是Medium,這些類針對不同的流媒體型別和編碼。

各種測試程式碼在testProgram目錄下,比如openRTSP等,這些程式碼有助於理解liveMedia的應用。

LIVE555 Media Server是一個純粹的RTSP伺服器。支援多種格式的媒體檔案:

      * TS流檔案,副檔名ts

      * PS流檔案,副檔名mpg

      * MPEG-4視訊基本流檔案,副檔名m4e

      * MP3檔案,副檔名mp3

      * WAV檔案(PCM),副檔名wav

      * AMR音訊檔案,副檔名.amr

      * AAC檔案,ADTS格式,副檔名aac

OpenCv由一系列 C函式和少量 C++類構成,同時提供了PythonRubyMATLAB等語言的介面,實現了影象處理和計算機視覺方面的很多通用演算法。

wxWidgets是一個開源的跨平臺的C++構架庫(framework),它可以提供GUI圖形使用者介面)和其它工具

Cg(C for Graphcis)語言,是NVIDIA 與Microsoft 合作研發,旨在為開發人員提供一套方便、跨平臺(良好的相容性),控制可程式設計圖形硬體的高階語言

OpenGL(全寫Open Graphics Library)是個定義了一個跨程式語言、跨平臺的程式設計介面的規格,它用於三維圖象(二維的亦可)。OpenGL是個專業的圖形程式介面,是一個功能強大,呼叫方便的底層圖形庫。

FFmpeg是一個開源免費跨平臺的視訊和音訊流方案,屬於自由軟體,採用LGPLGPL許可證(依據你選擇的元件)。它提供了錄製、轉換以及流化音視訊的完整解決方案。它包含了非常先進的音訊/視訊編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec裡很多codec都是從頭開發的。

Microsoft DirectX SDKDirectX程式設計的軟體。包含了開發尖端多媒體應用軟體不可或缺的開發工具,以及runtimeheaders及程式庫、範例執行檔案、檔案、DirectX工具、並且同時支援C++以及 Visual Basic開發軟體.

DirectX可以開發出高效能實時的應用程式,可以直接訪問計算機中的硬體和將來系統中新的硬體裝置。DirectX在硬體和應用之間提供了一致的介面以減少安裝和配置的複雜性,並且使硬體的利用達到最優。利用DirectX提供的介面,程式設計師能充分利用硬體的特性而不需要考慮其具體細節。

Platform SDK (PSDK)

Windows SDK(WSDK)是用來支援32位和64Windows平臺以及.NET框架程式設計模型的開發包。Windows SDK這個名字從Windows Vista開始使用,它包含以前Platform SDK中的所有內容,同時包含.NET框架的內容。

二、具體步驟見各個資料夾

↖第一步:下載live555程式碼

↖第二步:windows下編譯live555

    1、修改目錄下的win32config檔案,TOOLS32=E:\Microsoft Visual Studio 9.0\VC,即保證這個路徑是你的Vs2008路徑。

     2、編輯"LINK_OPTS_0 = $(linkdebug) msvcirt.lib" in win32config to "LINK_OPTS_0 = $(linkdebug) msvcrt.lib",由於編譯器所要LINK的執行庫不一樣了

3、修改groupsock/makefile.head,替換

"INCLUDES = -Iinclude -I../UsageEnvironment/include""INCLUDES = -Iinclude -I../UsageEnvironment/include -DNO_STRSTREAM".其他檔案下的makefile.head檔案做同樣修改。

    4、執行genWindowsMakefiles.cmd生成VS能夠編譯的*.mak檔案

     5、將以下內容儲存為live/compile.bat

call "E:\ Microsoft Visual Studio 9.0\VC\vcvarsall.bat"

cd liveMedia         

nmake /B -f  liveMedia.mak

cd ../groupsock

nmake /B -f  groupsock.mak

cd ../UsageEnvironment

nmake /B -f  UsageEnvironment.mak

cd ../BasicUsageEnvironment

nmake /B -f  BasicUsageEnvironment.mak

cd ../testProgs

nmake /B -f  testProgs.mak

cd ../mediaServer       

nmake /B -f  mediaServer.mak

cd ../WindowsAudioInputDevice

nmake /B -f  WindowsAudioInputDevice.mak

6、在命令列下執行compile.bat,就會看到很多編譯過程出現在CMD中了。

(需要用到live555中的已編譯庫)

注:

1、編譯的時候把C:\Program Files\Microsoft SDKs\Windows\v7.1libinclude中檔案分別考到vs2008E:\Microsoft Visual Studio 9.0\VC對應檔案中,再在命令列中執行compile.bat,產生了庫libBasicUsageEnvironment.liblibgroupsock.liblibUsageEnvironment.liblibliveMedia.lib

2、但是發現libWindowsAudioInputDevice_mixer.lib還是沒有,這個在後面也是要用到的,在網上找到一個版本 庫都編譯出來的可以直接解壓縮使用,不需要進行第二步(可以自己嘗試用.mak檔案產生lib檔案)

↖第三步:下載安裝OpenCv

注意要安裝WSDK dotNetFx40_Full_setup.exewinsdk_web.exe(我直接安裝在c盤的),新增安裝目錄下的includelibvs2008tools→options,因為omnimeeting專案中要用到windows.h

↖第四步:具體步驟見資料夾,我用的是wxMSW-2.8.10

注意:資料夾中網頁內容上是產生的Unicode DebugUnicode Release,這裡直接使用debugrelease,產生的檔案後面要用到

↖第五步:下載安裝fmod(安裝資料夾中的exe檔案,後面要用到FMOD Programmers API Win32\api中的各個檔案)

↖第六步:下載安裝cg toolkit(需要此檔案的標頭檔案和原始檔),

安裝DirectX9.0b SDK,然後配置,具體步驟見資料夾中文件,新增includelib

↖第七步:下載解壓openGL:詳細見資料夾

↖第八步:下載解壓ffmpeg,(需要此檔案的編譯庫)

配置MinGW+msys的檔案

:因為要和omnimeeting程式匹配,所以要考慮到ffmpeg版本的問題,使用0.4.9版本,資料夾中有個壓縮包,已編譯可直接解壓縮使用。

三、除錯過程中出現問題以及解決

在配置環境的時候,根據配置步驟已經添加了一些庫問價

第二遍 在編譯omnimeeting的時候,根據錯誤來新增缺少的庫檔案到環境變數中(先是分別編譯libomnistream_liblibomnistuff_lib,沒有錯誤了再編譯omnimeeting

1、缺少cv.h   有三個地方,我選擇第三個

 E:\omnimeeting\MinGW\msys\1.0\lib\perl5\5.8\msys\CORE

E:\omnimeeting\OpenCV\interfaces\swig\filtered

E:\omnimeeting\OpenCV\cv\include

2、缺少cxcore.h

E:\omnimeeting\OpenCV\cxcore\include

3、缺少highgui.h

E:\omnimeeting\OpenCV\otherlibs\highgui

4、在ffmpeg下新建了一個ffmpeg資料夾,把一些標頭檔案複製到裡面,同時把E:\omnimeeting\ffmpeg新增到環境變數

5、缺少 inttype.h時(詳細見儲存的網頁)

新增inttype.h的庫:E:\omnimeeting\MSYS-1.0\mingw\include,同時要把這個資料夾下的_mingw.h需要修改在最後一行的#endif /* __MINGW_H */前面新增#define __restrict__,如下
#define __restrict__
#endif /* __MINGW_H */

6、編譯libomnistream_lib出現:

編譯libomnistuff_lib的時候出現:

編譯vrfilter_test出現:

\ostreamreceiver.cpp(448) : error C2039: 'describeStatus' : is not a member of 'RTSPClient'

\ostreamvideodecoder.cpp(149) : error C3861: 'img_convert': identifier not found

error C2039是live555版本的原因,資料夾中有一個壓縮包可以直接使用

error C3861是ffmpeg版本的原因,資料夾中有直接可以使用的壓縮包(以編譯)

7、編譯omnitest出現:

1>LINK : fatal error LNK1104: cannot open file 'wxmsw28d_core.lib'

解決:在步驟四中用debug編譯時產生這些檔案,wxMSW-2.8.10目錄下的lib\vc_lib中,將這個路徑新增到環境變數,即tools→options→Projects and Solutions→VC++ Directories→Library files

8、編譯omnistuff_test時出現(已解決編譯通過):

1>Project : error PRJ0003 : Error spawning 'rc.exe'

解決步驟:

   1、執行VS2008安裝程式。

   2、在選擇要安裝的功能這一步時,依次展開語言工具”——“VisualC++”——“Visual C++ 工具,勾選Win32 工具一項。

   3、點更新按鈕。

   此時安裝程式將開始維護操作,完成後將解決生成rc.exe時出錯的問題。

   PS.如果還不行,就把語言工具”——“Visual C++下面所有沒有選的都選上在更新

這是VS的環境變數未配置導致的,解決方法很多.
你可以在我的電腦->系統屬性裡設定系統環境變數把你的rc.exe所在的資料夾加進去即可.
工具>選項>專案和解決方案>VC++目錄的可執行檔案下加入rc.exe所在的資料夾也可.
rc.exe一般都在C:\Program Files\Microsoft Visual Studio\VC\bin下

我把C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin新增進去之後這個問題解決,

但是出現1>LINK : fatal error LNK1104: cannot open file 'cv.lib',把E:\omnimeeting\OpenCV\lib新增進去解決

9、1>LINK : fatal error LNK1104: cannot open file 'avcodec-51.lib'

解決:avcodec-51.lib是編譯ffmpeg產生的,如果編譯生成不了就是ffmpeg版本的原因,我從網上找了一個版本ffmpeg-1可以使用

10live的庫libBasicUsageEnvironment.liblibgroupsock.liblibUsageEnvironment.liblibliveMedia.lib缺少

解決:這些庫是在執行compile.bat的時候生成的,但是libWindowsAudioInputDevice_mixer.lib還是沒有,在網上找到一個版本庫都編譯出來的

最後編譯通過,在omnimeeting的目錄下查詢生成的.exe檔案,然後執行,可能出現缺少檔案,這些檔案主要是在fmod、ffmpeg、live下,把這些檔案拷到這些.exe檔案目錄下面,再執行。

注:實踐證明,omnimeeting開原始碼所配套使用的庫以及軟體都非常的老了,建議不要使用。