JRTPlib簡介
在http://www.tekuba.net/program/10/中提到過RTP的例程,這裡參考網絡上的資料給出JRtpLIB的嵌入式arm環境以及桌面環境開發環境的建立。
RTP 是目前解決流媒體實時傳輸問題的最好辦法,要在 Linux 平台上進行實時傳送程式設計,可以考慮使用一些開放源代碼的 RTP 庫,如 LIBRTP、JRTPLIB 等。JRTPLIB 是一個面向對象的 RTP 庫,它完全遵循 RFC1889設計,在很多場合下是一個非常不錯的選擇。JRTPLIB 是一個用 C++ 語言實作的 RTP 庫,這個庫使用Socket 機制實作網絡通訊 是以可以運作在 Windows、Linux、FreeBSD、Solaris、Unix和VxWorks 等多種作業系統上。
一,x86版本JRTPLIB的編譯
來源:http://www.cnblogs.com/fengqing888/archive/2011/08/16/2140464.html
1. 下載下傳開發包解壓。分别下載下傳jrtplib-3.7.1.tar.gz和jthread-1.2.1.tar.gz。
下載下傳位址為:http://research.edm.uhasselt.be/jori/jrtplib/jrtplib-3.7.1.tar.gz和
http://research.edm.uhasselt.be/jori/jthread/jthread-1.2.1.tar.gz
這裡用到的軟體包在115上都有。
2. 将源檔案放到如下任意目錄中,這裡假設放到主目錄下:/home/nick/。分别解壓#tar -xzvf xxx,xxx為檔案名。解壓後出現兩個目錄,一個是jrtplib-3.7.1,一個是jthread-1.2.1。然後進行安裝,先安裝jthread,再安裝jrtplib。
3. jthread安裝:
進入jthead解壓目錄,運作#./configure配置環境,如果出現permission denied,說明我們需要給檔案configure執行的權限,運作#chmod a+x configure即可。配置完畢後運作#make,成功後再運作#make install。安裝成功以後會在/urs/local/include目錄下多出一個檔案夾jthread。
4. jrtplib安裝同上,全部安裝好以後會在/urs/local/include目錄下多出兩個檔案夾jrtplib3(可能由于版本不同,生成的檔案夾名字略有不同,比如叫jrtplib-3.7.1)和jthead。複制jthead下所有檔案(都是字尾為.h的頭檔案)到jrtplib檔案夾下,目的是為了讓所有頭檔案在一個目錄下友善調用。
注意:我在編譯jrtplib的時候出現如下錯誤:
rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp: In function 'std::string RTPGetErrorString(int)':
rtperrors.cpp:225:36: error: 'snprintf' was not declared in this scope
make[1]: *** [rtperrors.lo] 錯誤 1
make[1]:正在離開目錄 `/root/vedio/JRTPLib/src-x86/jrtplib-3.7.1/src'
make: *** [all-recursive] 錯誤 1
下面是解決辦法:來源http://www.cnblogs.com/my_life/articles/1953131.html
在 Fedora 13 中 make 提示的錯誤:
rtperrors.cpp: In function 'std::string RTPGetErrorString(int)':
rtperrors.cpp:225: error: 'snprintf' was not declared in this scope
為了 make 成功,需要修改 jrtplib-3.7.1 源檔案 rtpdefines.h
添加如下語句 :
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
5. 裝好以後系統環境如下,靜态動态庫安裝到了/usr/local/lib目錄下,包括libjrtplib-3.7.1.so和libjthread-1.2.1.so等。頭檔案在/usr/local/include/jrtplib-3.7.1目錄下。
6. 在jrtplib源代碼目錄裡有示例程式,在目錄example下,試驗一下編譯example1.cpp(先删除自帶的編譯好的example1),使用靜态庫libjrtp.a連結,編譯連結語句如下(注意用g++而不是gcc編譯,因為是連結階段需要g++):
g++ -o example1 example1.cpp -I /usr/local/include/jrtplib/ -ljrtp
即生成應用程式exmaple1,注意,-I(大寫的i)參數中路徑為jrtplib頭檔案目錄,注意:-ljrtp是小寫的“L”。根據實際情況修改。如果出現錯誤,說明動态連結庫路徑不對,有以下兩種方法可以對動态連結庫的路徑進行設定:
a、修改動态連結庫宏LD_LIBRARY_PATH。LD_LIBRARY_PATH 這個環境變量是大家最為熟悉的,它告訴loader:在哪些目錄中可以找到共享庫。可以設定多個搜尋目錄,這些目錄之間用冒号分隔開。export LD_LIBRARY_PATH=/usr/local/lib,然後再運作編譯,即可通過。這種方法隻是暫時修改路徑,在重新開機shell後會失效。
b、永久生效的方法為修改動态連結庫配置檔案/etc/ld.so.conf,或者在/etc/ld.so.conf.d裡建立一個新檔案,并把需要的目錄加到這個檔案裡。具體方法如下:
#cd /etc/ld.so.conf.d
#vim jrtplib 在編輯環境下加入/usr/local/lib,儲存退出。
#ldconfig 重新加載動态連結庫。
然後再執行編譯連結,成功生成example1檔案。
然後運作./example1。成功。
FROM:http://hi.baidu.com/nick0411/blog/item/8ec3a7090a6a99da63d98600.html
二,arm版JRTPLIB庫的編譯
參考來源:http://www.cnblogs.com/rockstone/archive/2010/01/15/1648809.html
環境:arm-linux交叉編譯工具鍊4.4.3
ubuntu 11.04
1,首先下載下傳jrtplib-3.7.1和jthread-1.2.1
例如,我建立了/root/vedio/JRTPLib檔案夾,在裡面建立
source:存放源碼壓縮包
src-arm:arm版本編譯的源碼
src-x86:x86版本的編譯的源碼
target-arm:arm版本的目标檔案夾(生成的檔案放在這裡)
target-x86:x86版本的目标檔案夾(在這裡我直接将x86版本的預設裝載了系統目錄裡,見上以部分,這裡不贅述)
下載下傳上述兩個檔案之後,分别将他們解壓到src-arm ,和 src-x86(上面的x86版本已經測試過了,這裡不做介紹,直接介紹交叉編譯arm版本)
2,首先編譯安裝 jthread
進入jthread-1.2.1檔案夾
編譯方法:
./configure --prefix=/root/vedio/JRTPLib/target-arm --host=arm-linux CC=arm-linux-gcc CXX=arm-linux-g++
make
make install
在編譯的時候出現了:configure: error: C compiler cannot create executables
原來是交叉編譯換将的權限不對,重新安裝交叉編譯環境即可。
這時會看到/root/vedio/JRTPLib/target-arm多了include和lib檔案。
3,編譯安裝jrtplib
/configure --host=arm-linux CXX=arm-linux-g++ CC=arm-linux-gcc --prefix=/root/vedio/JRTPLib/target-arm
make
在編譯的時候又出現了和x86版本一樣的錯誤
rtperrors.cpp:206: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp:206: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp: In function 'std::string RTPGetErrorString(int)':
rtperrors.cpp:225: error: 'snprintf' was not declared in this scope
make[1]: *** [rtperrors.lo] 錯誤 1
make[1]:正在離開目錄 `/root/vedio/JRTPLib/src-arm/jrtplib-3.7.1/src'
make: *** [all-recursive] 錯誤 1
我們按照x86的思路,解決如下
進入src修改tperrors.h
增加:
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
再執行make make install即可。
4,嘗試編譯arm版本的程式
我們将/root/vedio/JRTPLib/target-arm/include中的jthread中的頭檔案全部拷貝到jrtplib3中,然後到src-arm目錄下看到example檔案夾。裡面同樣是測試檔案,我們測試如下:
arm-linux-g++ example1.cpp -o example1 -L/root/vedio/JRTPLib/target-arm/lib -I/root/vedio/JRTPLib/target-arm/include/jrtplib3 -ljrtp -ljthread -lpthread
結果運作生成了example1可執行檔案,使用file檢視其檔案類型發現他是arm平台的。則我們将/root/vedio/JRTPLib/target-arm/include中的頭檔案和/root/vedio/JRTPLib/target-arm/lib中的庫檔案拷貝到arm開發闆上即可。
由這幾次編譯庫我們可以發現,主要的步驟就是先編譯依賴庫,取得編譯依賴庫得到的頭檔案和庫檔案,在編譯最終我們需要的庫的時候,我們需要制定依賴庫頭檔案和依賴庫的位置,就像-L/root/vedio/JRTPLib/target-arm/lib -I/root/vedio/JRTPLib/target-arm/include/jrtplib3這種結構,所謂的移植不過如此而已。
ps:關于使用jrtplib庫程式設計例程詳見“linux系統程式設計”部分。
感謝:http://www.cnblogs.com/rockstone/archive/2010/01/15/1648809.html
本文來源于特酷吧http://www.tekuba.net/, 原文位址:http://www.tekuba.net/program/178/