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/


 

Logo

更多推荐