最简 jrtplib 收发数据实例
来源:互联网 发布:vidown视频下载软件 编辑:程序博客网 时间:2024/05/16 17:20
jrtplib 的功能,在它的说明文档中有介绍:For applications such as a mixer or translator using the RTPSession class will not be a good solution. Other components can be used for this purpose: a transmission component, an SSRC table,an RTCP scheduler etc. Using these, it should be much easier to build all kinds of applications. 简单翻译过来就是它适合传输组件,SSRC表,RTCP调度等应用程序,但是并不适合做混合器和翻译器。
在jrtplib的使用的时候,有下面的几点需要被别注意:
(1)端口不能是奇数,否者运行时会出现错误:
ERROR: The specified port base is not an even number
(2)默认编译的jrtplib是没有打开宏RTP_SUPPORT_THREAD
也就是在接收数据的时候,它不会自动的查询是否接收到数据,需要在应用程序中添加轮询函数:sess.Poll()
jrtplib_receive.cpp 代码:
/*============================================================================= * FileName: jrtplib_receive.cpp * Desc: receive packet and print out the payloaddata * Author: licaibiao * LastChange: 2017-04-10 * =============================================================================*/#include <jrtplib3/rtpsession.h>#include <jrtplib3/rtpudpv4transmitter.h>#include <jrtplib3/rtpipv4address.h>#include <jrtplib3/rtpsessionparams.h>#include <jrtplib3/rtperrors.h>#include <jrtplib3/rtplibraryversion.h>#include <jrtplib3/rtppacket.h>#include <stdlib.h>#include <stdio.h>#include <iostream>#include <string>using namespace jrtplib;void checkerror(int rtperr){if (rtperr < 0){std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;exit(-1);}}int main(void){RTPSession sess;uint16_t portbase = 6664;int status;bool done = false;RTPUDPv4TransmissionParams transparams;RTPSessionParams sessparams;sessparams.SetOwnTimestampUnit(1.0/10.0);sessparams.SetAcceptOwnPackets(true);transparams.SetPortbase(portbase);status = sess.Create(sessparams,&transparams);checkerror(status);sess.BeginDataAccess();RTPTime delay(0.020);RTPTime starttime = RTPTime::CurrentTime();while (!done){status = sess.Poll();checkerror(status);if (sess.GotoFirstSourceWithData()){do{RTPPacket *pack;while ((pack = sess.GetNextPacket()) != NULL){std::cout << pack->GetPayloadData() << std::endl;sess.DeletePacket(pack);}} while (sess.GotoNextSourceWithData());}RTPTime::Wait(delay);RTPTime t = RTPTime::CurrentTime();t -= starttime;if (t > RTPTime(60.0))done = true;}sess.EndDataAccess();delay = RTPTime(10.0);sess.BYEDestroy(delay,0,0); return 0;}上面程序,以每0.02s的周期去查询是否有接收到数据,持续60s,接收到数据之后,将接收到的数据通过标准输出打印出来。
jrtplib_send.cpp 代码:
/*============================================================================= * FileName: jrtplib_send.cpp * Desc: sending packets to destination port * Author: licaibiao * LastChange: 2017-04-10 * =============================================================================*/#include <jrtplib3/rtpsession.h>#include <jrtplib3/rtpudpv4transmitter.h>#include <jrtplib3/rtpipv4address.h>#include <jrtplib3/rtpsessionparams.h>#include <jrtplib3/rtperrors.h>#include <jrtplib3/rtplibraryversion.h>#include <stdlib.h>#include <stdio.h>#include <iostream>#include <string>using namespace jrtplib;void checkerror(int rtperr){if (rtperr < 0){std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;exit(-1);}}int main(void){ int i; int num;int status; RTPSession sess;uint16_t portbase = 6666; uint16_t destport = 6664;#if 0uint32_t destip;destip = inet_addr("192.168.0.6"); if (destip == INADDR_NONE){std::cerr << "Bad IP address specified" << std::endl;return -1;}destip = ntohl(destip);#elseuint8_t destip[]={192,168,0,6};#endif std::cout << "Number of packets you wish to be sent:" << std::endl;std::cin >> num;RTPUDPv4TransmissionParams transparams;RTPSessionParams sessparams;sessparams.SetOwnTimestampUnit(1.0/10.0);sessparams.SetAcceptOwnPackets(true);transparams.SetPortbase(portbase);status = sess.Create(sessparams,&transparams);checkerror(status);RTPIPv4Address addr(destip,destport);status = sess.AddDestination(addr);checkerror(status);for (i = 1 ; i <= num ; i++){printf("\nSending packet %d/%d\n",i,num);status = sess.SendPacket((void *)"1234567890",10,0,false,10);checkerror(status);RTPTime::Wait(RTPTime(1,0));}sess.BYEDestroy(RTPTime(10,0),0,0); return 0;}上面程序,通过标准输入确定需要发送数据的包数,然后以1s的周期发送数据。这里是p2p传输,发送之前需要指定发送地址和发送端口。这里的地址就是接收端主机的IP地址,这里的目的端口,就是接收端程序设置的本地端口。
Makefile文件:
APP = testLINK_OPTS = -ljrtpOBJ = jrtplib_receive.cpp#OBJ = jrtplib_send.cppout: g++ $(OBJ) -o $(APP) $(LINK_OPTS)clean:rm -rf *o $(APP)编译执行部分结果:
发送端:
licaibiao@lcb:~/test/RTP/test_jrtplib$ ./test Number of packets you wish to be sent:100Sending packet 1/100Sending packet 2/100Sending packet 3/100Sending packet 4/100Sending packet 5/100Sending packet 6/100
接收端:
licaibiao@ubuntu:~/test/RTP_TEST/JRTPLIB/biao$ ./test 12345678901234567890123456789012345678901234567890123456789012345678901234567890
注意:在编译运行本程序之前,需要正确安装好jrtplib
工程代码可在这里下载:最简jrtplib 收发数据实例
- 最简 jrtplib 收发数据实例
- 最简 jrtplib 收发数据实例
- 最简 jrtplib 收发数据实例——非常详细简洁
- Jrtplib的最基本的操作实例
- 分析jrtplib收发RTCP包
- 分析jrtplib收发RTCP包
- linux 使用jrtplib收发h.264视频文件
- JRTPLIB使用实例
- JRTPLIB使用实例
- JRTPLIB使用实例
- JRTPLIB使用实例
- JRTPLIB使用实例
- JRTPLIB使用实例
- JRTPLIB使用实例
- Java最简单的UDP收发数据的例子
- Jrtplib收发H264文件 + FFMPEG解码+VFW播放视频
- Python实例 -- 收发邮件
- ActiveMQ-1.收发消息之最简例子
- ArrayList 遍历时删除(添加)常见陷阱及其解决以及fail-fast 机制
- 闲扯
- Bootstrap 表单布局
- Arrays类#包装类#
- bzoj2287【POJ Challenge】消失之物
- 最简 jrtplib 收发数据实例
- 合理使用MySQL索引建立高质量查询语句
- Unity Mathf 数学运算
- (gedit:11953): Gtk-WARNING **: GtkScrolledWindow 0xda3880 is mapped but visible child GtkScrollbar 0
- hmailserver 通过 webmail 修改密码
- 再议数据库军规
- org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFacmysql的安装版本和驱动版本不一致的问题
- Segmentation fault (core dumped)的解决办法
- C++在release模式下可以进行调试