jrtplib+jthread 交叉编译

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

 

一、移植JRTPLib到嵌入式(arm)平台

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.1jthread-1.2.1两个目录。

安装jthread

 

采用默认的安装路径,安装结束后将回在/usr/local/include  /usr/local/lib下生成相应的头文件与库。此外,还需要指定编译环境,将Host设置为arm -linuxCC设定为交叉编译器的路径,具体设置方法可以在终端中输入./configure help查看。

进入解压文件目录:

 

cd /usr/local/software/ jthread-1.2.1

 

在终端中输入:

 

./configure

-host=arm-linux

CC=arm-linux-gcc

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有些人会遇到armpc无法互相接受数据包的问题,但是pcpcarmarm就可以收到。我用sniffer抓了一下包发现确实是有数据包的,所以应该不是程序的问题。这个问题上网查了一下,也没人说的明白,只有一个高人点了一下,可能是字节序和位域的问题。自己又研究了一下,也是一知半解。

一般x86pc机是用小端字节序(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目录下多了JThreadJRtpLib的库文件:

 

测试

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

 

 

 

JRTPLIBarmpc间收不到数据的问题

最近本人在作关于RTP的项目,要求在armpc间用RTP协议传输数据。

1. 下载jrtplib-3.7.1jthread-1.2.1

2. pc上编译很简单,windows下编译过程如下:

首先编译jthread库。然后解压缩jrtplib,打开jrtplib.dsw工程,注意工程的include路径设置,要包含jrtplibjthread的头文件,然后编译。将编译生成的jrtplib.libjthread.lib拷贝到Microsoft Visual StudioVC98/Lib目录下。在编译jrtplib.libjthread.lib的时候,在project——settings——C/C++——Code generation:use run-time library中,对于debug,选择:Debug Multithreaded DLL,对于release,则选择:Multithreaded DLL

那些example的编译,需要在cpp文件开头加上:
#pragma comment(lib, "jrtplib.lib")
#pragma comment(lib, "jthread.lib")
#pragma comment(lib, "WS2_32.lib")//pragma
的作用自己上网查吧

编译的时候,同样选择编译选项:Debug Multithreaded DLL(对于debug);Multithreaded DLL(对于release)。

然后在windows上测试example1,这是一个往指定IP的端口上发包的程序,同样也可以收包,测试通过。

3.jrtplib库的移植,主要参考了这篇文章http://blog.csdn.net/neohuo/archive/2006/03/08/618684.aspx

编译器我用的arm-linux-gcc3.4.12.95.3也用过,不过需要修改一下rtperror里面的代码。可能还有些问题没提到,自己注意一下吧。

4.移植成功后,我遇到了第一个棘手的问题,提示can't retrieve login name,建立不了rtpsession

后来发现是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了。

5.有些人会遇到armpc无法互相接受数据包的问题,但是pcpcarmarm就可以收到。我用sniffer抓了一下包发现确实是有数据包的,所以应该不是程序的问题。这个问题上网查了一下,也没人说的明白,只有一个高人点了一下,可能是字节序和位域的问题。自己又研究了一下,也是一知半解。

一般x86pc机是用小端字节序(little endian),而嵌入式平台一般是大端字节序(big endian),可能是由于字节序的不同,导致了明明存在数据包,却认不出来的问题。其实,JRTPLIB开发者可能已经考虑到了这个问题(真牛),在rtpstructs.h中,有这样的代码定义:

struct RTPHeader
{
#ifdef RTP_BIG_ENDIAN
 uint8_t version:2;
 uint8_t padding:1;
 uint8_t extension:1;
 uint8_t csrccount:4;
 
 uint8_t marker:1;
 uint8_t payloadtype:7;
#else // little endian
 uint8_t csrccount:4;
 uint8_t extension:1;
 uint8_t padding:1;
 uint8_t version:2;
 
 uint8_t payloadtype:7;
 uint8_t marker:1;
#endif // RTP_BIG_ENDIAN
 
 uint16_t sequencenumber;
 uint32_t timestamp;
 uint32_t ssrc;
};
  
这是一个位域结构体,明眼人一下子就看出来了,jrtplib库使用哪种字节序完全取决于RTP_BIG_ENDIAN的定义,这样问题就简单化了。

我看了一下我编译armjrtplib库的rtpconfig_unix.h这个文件,里面果然定义了一个RTP_BIG_ENDIAN,所以要和pc采用的小端字节序一样,将这个定义取消掉,重新编译库。

最后运行exmaple1例子,pc arm可以互相接受数据包拉!:)这样会引起其他什么问题我还不知道,明天就可以动手编写自己的程序了,呵呵。

开源库交叉编译(十一)--- JRTPLIB 开源库ARM平台交叉编译 阅读详情

相关推荐

jrtplibjthread交叉编译

在linux下对jthreadjrtplib库进行交叉编译时,碰到了一些问题,现记录如下: 1. 两者版本为jrtplib-3.7.1和jthread-1.2.1 2. 首先交叉编译jthread,先configure,执行如下指令:./configure --prefix=/usr/dfb/ -host=arm-linux CC=arm-linux-gnueabihf-gcc CXX=ar

qyl_qiyalu的博客 824

vlc播放rtp g711音频,交叉编译jrtplibjthread

rtp g711传输音频到vlc播放

loglingyy的博客 836

跨平台实时传输库JRTPLIB的CMake交叉编译实战

本文详细介绍了如何使用CMake对跨平台实时传输库JRTPLIB进行交叉编译,适用于ARM64架构的嵌入式设备。通过工具链配置、CMake参数设置及常见问题排查,帮助开发者高效完成开源库的编译与部署,提升音视频传输项目的开发效率。

weixin_28839549的博客 182

交叉编译JRTPLib

1. 确认编译环境,最新的jrtplib库编译配置需要使用cmake。所以先要确认是否安装了cmake: cmake -version 另外交叉编译器必须要有,这个就不多说。 2. 找到jrtplib源代码目录下的CMakeLists.txt文件,在project项的顶上加上以下几项: SET(CMAKE_SYSTEM_NAME Linux) SET(TOOLCHAIN_DIR "/usr/local/arm-linux") SET(CMAKE_C_COMPI...

ComputerInBook的专栏 645

JRTPLIB库arm交叉编译详解

系统平台:Ubuntu  16.04  开发板:gec6818  ARM jrtplib库:libjrtp.so.3.11.1.tar.gz jthread版本:libjthread.so.1.3.3.tar.gz http://research.edm.uhasselt.be/jori/page/CS/Jrtplib.html 本交叉编译是将RTP接收端放在ARM开发板上运行,RT

qq_35547767的博客 2207

jrtplib 编译安装配置

RTP 是目前解决流媒体实时传输问题的最好办法,而JRTPLIB 是一个用C++语言实现的RTP库,包括UDP通讯,它的主页地址是:Jori's page jrtplib 源码的获取,可以在它的主页上直接下载,也可以使用git 直接克隆一份。因为它的主页是国外网站,下载速度非常慢,我这里提供一份已经下载好的最新的jrtplib源码:jrtplib-3.11.1.tar.gz 我...

Biao 3061

Jthread1.3.1 Jrtplib3.9.1跨平台交叉编译之Android(一)

折腾two days终于编译OK,主要参考http://blog.csdn.net/nickwar/article/details/9133399

晨曦2012的专栏 3251

jrtplib linux编译,jrtplib+jthread 交叉编译

JRTPLIB库是一个RTP协议的开源库,使用这套库文件,我们可以创建端到端的RTP连接,实现数据的实时传输。JRTPLIB是使用标准c++编写的.tar -jxvf jrtplib-3.7.1.tar.bz2tar -zxvf jthread-1.2.1.tar.gz解压后在当前文件夹下会生成rtplib-3.7.1,jthread-1.2.1两个目录。安装jthread采用默认的安装路径,安装...

weixin_39745345的博客 361

linux 下 jrtplib+jthread 交叉编译

一、移植JRTPLib嵌入式(arm)平台 JRTPLIB库是一个RTP协议的开源库,使用这套库文件,我们可以创建端到端的RTP连接,实现数据的实时传输。 JRTPLIB是使用标准c++编写的. 下载 你可以在这里下载JRtplib,同时,需要下载JThread。 解压 解压目录/usr/local/software/ tar -jxvf jrtplib

武溪嵌人 1157

Jrtplib rtp(3.7.1)开源库和jthread1.2.1安装(非交叉编译版以及交叉编译版)

Jrtplib rtp(3.7.1)开源库和jthread1.2.1安装(非交叉编译版以及交叉编译版) Linux (非交叉编译版) 1.要安装jrtplib前要先将开源函数库jthread1.2.1安装 Jthread(非交叉编译版)的安装: 进入jthread-1.2.1文件夹 运行:j./configure  (可加上–prefix=(路径)配置安装路径//例子:./conf

YanMY2012的专栏(若有侵犯,请您指出,我会删档) 1905

嵌入式linux交叉编译jrtplib

1. 在官网上面下载jrtplib-3.7.1.tar.gz和jthread-1.2.1.tar.gz source code。 官网:http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib http://research.edm.uhasselt.be/jori/jrtplib/jrtplib-3.7.1.tar.gz ...

sunxiaopengsun的专栏 609

jrtplib+jthread arm 交叉编译

JRTPLIB库是一个RTP协议的开源库,使用这套库文件,我们可以创建端到端的RTP连接,实现数据的实时传输。 JRTPLIB是使用标准c++编写的. 下载 你可以在这里下载JRtplib,同时,需要下载JThread。 解压 解压目录/usr/local/software/ tar -jxvf jrtplib-3.7.1.tar.bz2 tar -zxvf jthread-1.2

ALLENJIAO的专栏 1750

Jrtplib移植到arm平台

本文描述Jrtplib库在arm平台上的移植

三言两语 2819

交叉编译jrtplib 问题

问题描述: 1、安装包:jrtplib-3.7.1.tar.gz  jthread-1.2.1.tar.gz 2、步骤:分别解压两个安装包              进入jthread-1.2.1使用./configure -host=arm-linux CC=arm-linux-gcc CXX=arm-linux-g++ 命令配置          make          make

康源 留言的专栏 1895

jrtplib编译和交叉编译

==============================================准备工作========================================================== 1.下载jrtplib,jthread     http://research.edm.uhasselt.be/jori/jrtplib/jrtplib-3.9.1.tar.bz

奋斗 3499
上一篇: 移植tslib1.3
下一篇: Qt configure 参数不完全说明
futurepeter
博客等级 码龄19年 8粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值