JRTPLIB库是一个RTP协议的开源库,使用这套库文件,我们可以创建端到端的RTP连接,实现数据的实时传输。
JRTPLIB是使用标准c++编写的.
下载
你可以在这里下载JRtplib,同时,需要下载JThread。
解压
解压目录/usr/local/software/
tar -jxvf jrtplib-3.7.1.tar.bz2
tar -zxvf jthread-1.2.1.tar.gz
解压后在当前文件夹下会生成rtplib-3.7.1,jthread-1.2.1两个目录。
安装jthread
采用默认的安装路径,安装结束后将回在/usr/local/include /usr/local/lib下生成相应的头文件与库。此外,还需要指定编译环境,将Host设置为arm -linux,CC设定为交叉编译器的路径,具体设置方法可以在终端中输入./configure –help查看。
进入解压文件目录:
cd /usr/local/software/ jthread-1.2.1
在终端中输入:
./configure
-host=arm-linux
CC=arm-linux-gcc
![jrtplib+jthread 交叉编译 openssl 交叉编译](http://img.413yy.cn/images/31101031/31014747t01358ca8bb5fd3f76c.jpg)
CXX=arm-linux-g++
将生成一个Makefile文件。
执行
make
make install
jthread安装完毕。
安装JRtpLib
和安装JThread类似
进入解压后目录
cd /usr/local/software/ rtplib-3.7.1
执行配置文件
./configure
-host=arm-linux
CC=arm-linux-gcc
CXX=arm-linux-g++
编译:
1. 遇到了第一个棘手的问题,提示can't retrieve login name,建立不了rtpsession。在rtpsession.cpp中。
后来发现是RTPSession::CreateCNAME这个函数搞得鬼
这个函数会从系统调用里获取loginname,但是一般的板子由于内核和文件系统的原因都没有loginname,所以
if (!gotlogin)
{
char *logname = getenv("LOGNAME");
if (logname == 0)
return ERR_RTP_SESSION_CANTGETLOGINNAME;//这里return了一个error
strncpy((char *)buffer,logname,*bufferlength);
}
所以我强制将logname的值设为root,就ok了。
2、有些人会遇到arm和pc无法互相接受数据包的问题,但是pc和pc,arm和arm就可以收到。我用sniffer抓了一下包发现确实是有数据包的,所以应该不是程序的问题。这个问题上网查了一下,也没人说的明白,只有一个高人点了一下,可能是字节序和位域的问题。自己又研究了一下,也是一知半解。
一般x86的pc机是用小端字节序(little endian),而嵌入式平台一般是大端字节序(big endian),可能是由于字节序的不同,导致了明明存在数据包,却认不出来的问题
解决方法:在/usr/local/software/jrtplib3/src/rtpconfig_unix.h 中注销掉大端模式
//#define RTP_BIG_ENDIAN // comment this if the target is a little endian system
//#define RTP_SUPPORT_THREAD
添加线程后编译不通过,所以一起把线程宏定义注销掉
make
make install
完成后,可以看到/usr/local/lib目录下多了JThread和JRtpLib的库文件:
测试
在JRtpLib目录下有几个例子程序,我们可以用来测试JRtpLib。进入/prj/share/source/jrtplib-3.7.1/examples目录:
cd /prj/share/source/jrtplib-3.7.1/examples
将编译好(下载时已交叉编译好,可以通过file example1查看,如果看到目标使用环境是ARM则说明以交叉编译好,另外如果没有剪裁,也可以通过arm_v5t_le-strip example1进行剪裁以去掉调试信息)的例子文件复制到nfs目录下:
cp example1 /opt/nfs//opt/dvsdemos/
登陆到开发板,进入文件所在目录,输入:
./example1
即可看到运行结果:
enter local portbase
JRTPLIB在arm和pc间收不到数据包的问题
最近本人在作关于RTP的项目,要求在arm和pc间用RTP协议传输数据。
1. 下载jrtplib-3.7.1和jthread-1.2.1。
2. pc上编译很简单,windows下编译过程如下:
首先编译jthread库。然后解压缩jrtplib,打开jrtplib.dsw工程,注意工程的include路径设置,要包含jrtplib和jthread的头文件,然后编译。将编译生成的jrtplib.lib和jthread.lib拷贝到Microsoft Visual Studio的VC98/Lib目录下。在编译jrtplib.lib和jthread.lib的时候,在project——settings——C/C++——Code generation:use run-time library中,对于debug,选择:Debug Multithreaded DLL,对于release,则选择:Multithreaded DLL。