下载jrtplib-3.7.1.rar后,首先将其解压到一个临时文件夹中,然后开始后续工作。
首先需要强调的是,jrtplib是一个库而不是应用程序,编译后我们获得的是.lib文件。这个文件是用来实现RTP协议的,意义和我们在写WIN32程序时用到的kernel.lib一样。
解压后的文件夹中包含两个目录,jrtplib-3.7.1和jthread-1.2.1,打开这两个目录后我们可以看到下面又有两个同名的目录,为了后面能顺利编译,我们把同名目录下的文件全部考到上一级目录中,就是说把f:\jrtplib-3.7.1\jrtplib-3.7.1\*.* 复制到f:\jrtplib-3.7.1\。同理,把f:\jthread-1.2.1\jthread-1.2.1\*.* 复制到f:\jthread-1.2.1\
完成上述步骤后我们就可以开始编译库文件了。
Windows平台下建议使用Visual C++6.0。
首先编译多线程库jthread,在vc6中直接打开工作区文件jthread.dsw,改变工程设置,选中source file下的文件,点右键选择setting,确保code generation下Use run-time library 为debug mulitithreaded DLL或debug mulitithreaded。
然后选build就可以了,和上面一样的方法完成jrtpthread的编译。这个底下的文件比jthread多一些。
默认产生的文件是jthread.lib和jrtplib.Lib,这两个文件分别位于两个文件夹下的debug文件夹下,将它们复制到VC6的lib文件夹下。
完成上述工作后我们就可以开始尝试编译jrtplib附带的examples。
创建一个新的Win32 Console 应用程序项目,添加example文件到source files文件夹中,然后添加jrtplib工程下的所有.h头文件,这里我们可以用VC6提供的一个功能偷懒:)将jrtplib项目添加到本工作区,然后将Header Files下的所有文件复制到我们创建的工程的Header Files文件夹里面。
修改example.cpp文件,在文件开始添加
#pragma comment(lib, "jrtplib.lib")
#pragma comment(lib, "jthread.lib")
#pragma comment(lib, "WS2_32.lib")
或者在VC中a) Project->Settings->Link中Object/library modules:添加jthread.lib jrtplib.lib,
b) Link中添加ws2_32.lib
检查code generationdebug mulitithreaded DLL或debug mulitithreaded,方法同上文中检查库文件的方法。
最后就可以编译、连接、生成可执行文件了。
(1). 输入端口,IP后出错
ERROR: Can't retrieve login name
这是rtpsession.cpp中的createCNAME函数有问题
if (!gotlogin)
{
// char *logname = getenv("LOGNAME");
if (logname == 0)
return ERR_RTP_SESSION_CANTGETLOGINNAME;
strncpy((char *)buffer,logname,*bufferlength);
}
logname要求获得登陆名,而板子一般没有登陆名,将其强制改为root即可
if (!gotlogin)
{
// char *logname = getenv("LOGNAME");
char *logname = "root";
if (logname == 0)
return ERR_RTP_SESSION_CANTGETLOGINNAME;
strncpy((char *)buffer,logname,*bufferlength);
}
(2)板子和PC收发数据不能接收
在PC和板子上同时运行jrtplib例子程序example1(此程序可同时收发),在PC和板子之间收发数据,程序能够运行但双方都接收不到数据,结果如下:
查阅资料发现是字节序和位域的问题,一般x86的pc机是用小端字节序(little endian),而嵌入式平台一般是大端字节序(big endian),可能是由于字节序的不同,导致了明明存在数据包,却认不出来的问题。
这是一个位域结构体,jrtplib库使用哪种字节序完全取决于RTP_BIG_ENDIAN的定义,这样问题就简单化了。
看了一下我编译arm下jrtplib库的rtpconfig_unix.h这个文件,里面果然定义了一个RTP_BIG_ENDIAN,所以要和pc采用的小端字节序一样,先是直接在rtpconfig_unix.h中注释掉了
然后在重新编译库,执行
./configure –host=arm-linux –prefix=/usr/local/arm/2.95.3
make
make install
完了再次运行example1,还是不行,查看rtpconfig_unix.h发现刚注释掉到内容又恢复了,
最后查找发现是此文件是由./configure命令生成的,所以先执行./configure命令,然后再注释上面的内容,最后
make
make install
编译完成再次运行example1,能受到数据包,结果如下:
(3)自己写的接收程序写文件出错
接收端程序是在example3的基础上修改的,收到到数据包信息全部存在
RTPPacket *pack;
这个类指针当中,可以通过
uint8_t *data;
size_t *length;
data=pack->GetPayloadData();
length=pack->getPayloadLength();
提取出负载数据和负载长度。
收到数据以后以文件形式存下来。
if((write(outfile,data,length))<0)
{
perror("write outfile error;");
return -1;
}
最开始把打开文件放在开头,写入文件放在接收数据之后,但一直不能正确写文件,提示:
bad file descriptor
后来发现把打开文件放到写文件之前(即在接收数据到while循环之内)可以正确写数据,分析原因觉得可能是由于接收程序是一个多线程控制的而引起的。但是这样每次接收都要打开文件,会导致接收速度变慢,试着把打开文件放到循环外边发现也可以正确写数据,具体是什么原因导致这样暂时还不清楚。
(4)接收数据时有数据丢失现象,发送端发送数据时发现发送速度太快,所以数据瞬间发完,而不像例子程序一样一包一包的发送,最开始一直以为是设置时戳单元和时戳增量有问题,
sessparams.SetOwnTimestampUnit(1.0/1000.0);
sess.SetDefaultTimestampIncrement(10);
但改了几次还是没有变化,最后仔细对比例子程序,发现是
RTPTime ::Wait(RTPTime(0,0));
这个函数的位置放错了,此函数的作用就是发完一个包后等待一定时间(其中括号中第一个参数表示秒,第二个表示微秒),发送程序中将其放到了while循环之外,没有了这个等待时间而接收端还是以此间隔接收数据当然会丢失数据了,将其挪到循环之内就可以了。
现在接收到的数据是以文件的形式存下来的,但是最后想要达到的目的是与MPlayer结合起来,使视频采集,压缩后的数据在接收端能够实时的播放出来,现在存在的问题就是如何把收到的数据流传到MPlayer中实时播放,下一阶段的工作首先是将MPlayer的源代码研究清楚,然后再想办法将接收数据实时传给MPlayer。
对于本博客有任何问题的朋友可加Q:992139738
分享到:
相关推荐
特别是在商务、教育、医疗等领域,音视频通讯功能的需求日益增长。Windows即时通讯包就是这样一个强大的工具,专为开发者提供高质量的音视频SDK,助力构建高效、稳定的通讯应用。 此Windows即时通讯包的核心亮点...
支持Windows平台音频即时通讯应用开发 支持C++、C#、Java、Delphi、VB.Net、Qt等开发语言 集成H.264、AAC、AMR等编解码技术 封装音视频的采集、编解码、传输、显示和播放等模块 提供客户端SDK和服务器SDK API接口
在IT行业中,视频通讯与监控技术是现代通信和安全领域的重要组成部分,特别是在移动设备上,如Windows Mobile平台。本文将详细解析如何在Windows Mobile ARM架构上开发可视化通讯和视频监控应用,利用给定的资源——...
“AnyChat即时通讯平台”是一款专为满足企业级即时通讯需求而设计的跨平台解决方案,它结合了H.264视频编码标准、AAC音频编码标准以及P2P技术,实现了高清视频通讯。该平台由广州佰锐网络科技有限公司研发,旨在提供...
这个“windows——socket通讯.zip”文件显然包含了关于如何在Windows平台上使用Socket进行UDP和TCP通信的示例代码。让我们深入探讨一下Windows Socket编程的基础知识,以及UDP和TCP这两种传输协议的特点。 首先,...
音视频通讯技术是现代信息化社会中的重要组成部分,尤其在企业项目和在线服务中扮演着关键角色。随着技术的发展,音视频即时通讯解决方案已经成为许多企业和机构不可或缺的工具,它能够实现跨平台、高质量、低延迟的...
基于C++实现的一款跨操作系统平台、支持多种协议的即时通讯软件源代码,支持视频 功能: 通讯 xmpp协议 支持点对点消息 文本 表情 语音(P2P) 视频(P2P) 文件传输 远程桌面、远程控制 支持群功能(会议室...
在Windows平台上实现基于WebRTC的一对多音视频通讯,是一个常见的应用场景,例如在线教育、远程医疗、多人视频会议等。 这个项目是一个入门级别的示例,主要面向初学者,它演示了如何创建一个简单的系统,允许一个...
AnyChat是一款知名的音视频通讯 SDK,提供了跨平台的解决方案,包括Android、iOS、Windows等,使得开发者能够快速集成到自己的应用中。 1. **音视频编解码**:在即时通讯中,音视频数据需要经过编解码才能在网络上...
VC++可以借助Windows SDK中的相关组件,如Winsock进行网络编程,结合音视频编解码技术,实现跨平台的通讯功能。 在"第10章"这个文件中,可能包含了关于如何使用VC++实现视频编解码和音视频通讯的具体步骤、代码示例...
在IT行业中,Linux音视频即时通讯平台是一种专为Linux操作系统设计的实时通信解决方案。它基于Linux内核2.6.x版本进行开发,这意味着它能够充分利用Linux系统的稳定性和效率优势,为用户提供高效、可靠的音视频通信...
可以运行在windows所有版本上,实现与ios、linux、web、android等平台的通话,开放了源码,在/src文件夹下,有服务器端跟客户端的;API接口说明在/doc文件夹下,可以参考进行二次开发。支持1080P高清,P2P传输,完美...
“AnyChatCoreSDK_Win32(MBCS)_V4.5”这个文件很可能是某音视频即时通讯平台的SDK(Software Development Kit),专为Windows 32位系统设计,支持多字节字符集(MBCS),适用于开发人员集成到自己的应用程序中。...
首先,我们要了解Embedded Visual C++,这是微软提供的一款专门针对Windows CE平台的集成开发环境(IDE)。eVC++结合了Visual C++的功能,提供了为Windows CE开发应用程序的工具链,包括源代码编辑器、编译器、调试...
本项目是基于C#编程语言实现的一个局域网视频会议软件,它集成了音频通讯和视频通讯功能,对于学习C#编程以及网络通信技术的人来说是一个很好的参考资料。 首先,我们要了解C#语言的基础。C#是由微软开发的一种面向...
C#是一种由微软开发的面向对象的编程语言,特别适合构建Windows平台上的应用程序,包括即时通讯软件。在这个"C#视频即时通讯源代码"中,我们可以深入探讨以下几个关键知识点: 1. **C#编程基础**:C#具有丰富的类库...
本文将深入探讨一个基于C#语言开发的局域网视频会议软件,该软件实现了音频和视频通讯功能。 首先,C#(读作"C sharp")是一种由微软公司推出的面向对象的编程语言,它被广泛用于构建Windows平台上的应用程序,包括...
1. **跨平台兼容性**:由于视频通讯技术需要在不同平台上运行,如Web、Windows、iOS、Android和Linux,因此开发者的应用程序必须具备跨平台兼容性。这意味着开发者需要对各种操作系统和硬件平台的特性有深入理解,并...