使用JRTPLIB收发RTP数据包
生活随笔
收集整理的這篇文章主要介紹了
使用JRTPLIB收发RTP数据包
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一. 前言
????????JRTPLIB 是 C++ 語言編寫的 RTP 庫,它幫助我們封裝了 RTP 協(xié)議細(xì)節(jié),用戶通過提供好的接口可以設(shè)置 RTP 包信息并發(fā)送到指定地址,也可以接收 RTP 包取出信息。
????????本文僅介紹如何使用 JRTPLIB 發(fā)送/接收 RTP 數(shù)據(jù)包,我在這篇博客又介紹了如何使用 JRTPLIB 構(gòu)造 RTP 數(shù)據(jù)包來荷載 H264 碼流數(shù)據(jù)。
二. 下載編譯安裝
git clone https://github.com/j0r1/JRTPLIB.git cd JRTPLIB cmake CMakeLists.txt make sudo make install三. 代碼實(shí)戰(zhàn)
1. JRTPLIB接收RTP包程序
#include <jrtplib3/rtpsession.h> #include <jrtplib3/rtplibraryversion.h> #include <jrtplib3/rtpudpv4transmitter.h> #include <jrtplib3/rtpsessionparams.h> #include <jrtplib3/rtppacket.h> #include <iostream> #include <arpa/inet.h>using namespace jrtplib;void checkerror(int rtperr) {if (rtperr < 0) {std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;exit(-1);} }int main() {std::cout << "Using JRTPLib version: " << RTPLibraryVersion::GetVersion().GetVersionString() << std::endl;uint16_t localport;std::cout << "Enter local port(even): ";std::cin >> localport;RTPUDPv4TransmissionParams tranparams;tranparams.SetPortbase(localport);RTPSessionParams sessparams;sessparams.SetOwnTimestampUnit(1.0 / 10.0);sessparams.SetAcceptOwnPackets(true);RTPSession sess;int status = sess.Create(sessparams, &tranparams);checkerror(status);RTPTime delay(0.020);RTPTime startTime = RTPTime::CurrentTime();bool done = false;while (!done) {sess.BeginDataAccess();if (sess.GotoFirstSourceWithData()) {do {RTPPacket* packet;while ((packet = sess.GetNextPacket()) != NULL) {std::cout << "Got packet!" << std::endl;std::cout << "SSRC: " << packet->GetSSRC() << std::endl;std::cout << "Payload data: " << packet->GetPayloadData() << std::endl;std::cout << "Payload type: " << packet->GetPayloadType() << std::endl;std::cout << "Packet length: " <<packet->GetPacketLength() << std::endl;std::cout << "Sequence number: " << packet->GetSequenceNumber() << std::endl;std::cout << "Timestamp: " << packet->GetTimestamp() << std::endl;std::cout << std::endl;sess.DeletePacket(packet);} } while (sess.GotoNextSourceWithData());}sess.EndDataAccess();RTPTime::Wait(delay);}sess.EndDataAccess();return 0; }編譯后運(yùn)行如上,設(shè)置本地監(jiān)聽端口后就會(huì)開始等待 RTP 數(shù)據(jù)。
2. JRTPLIB發(fā)送RTP包程序
#include <jrtplib3/rtpsession.h> #include <jrtplib3/rtplibraryversion.h> #include <jrtplib3/rtpudpv4transmitter.h> #include <jrtplib3/rtpsessionparams.h> #include <jrtplib3/rtppacket.h> #include <iostream> #include <arpa/inet.h>using namespace jrtplib;void checkerror(int rtperr) {if (rtperr < 0) {std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;exit(-1);} }int main() {std::cout << "Using JRTPLib version: " << RTPLibraryVersion::GetVersion().GetVersionString() << std::endl;uint16_t localport;std::cout << "Enter local port(even): ";std::cin >> localport;std::string ipstr;std::cout << "Enter the destination IP address: ";std::cin >> ipstr;uint32_t destip = inet_addr(ipstr.c_str());if (destip == INADDR_NONE) {std::cerr << "Bad IP address specified" << std::endl;return -1;}// The inet_addr function returns a value in network byte order, but// we need the IP address in host byte order, so we use a call to// ntohldestip = ntohl(destip);uint16_t destport;std::cout << "Enter the destination port: ";std::cin >> destport;int num;std::cout << "Number of packets you wish to be sent: ";std::cin >> num;RTPUDPv4TransmissionParams tranparams;tranparams.SetPortbase(localport);RTPSessionParams sessparams;sessparams.SetOwnTimestampUnit(1.0 / 10.0);sessparams.SetAcceptOwnPackets(true);// Now, we'll create a RTP session, set the destination, send some// packets and poll for incoming data.RTPSession sess;int status = sess.Create(sessparams, &tranparams);checkerror(status);RTPIPv4Address destAddr(destip, destport);status = sess.AddDestination(destAddr);checkerror(status);sess.SetDefaultPayloadType(96);sess.SetDefaultMark(false);for (int i = 1;i <= num;++i) {std::cout << "Sending packet " << i << "/" << num << std::endl;status = sess.SendPacket((void*)"0123456789", 10, 0, false, 10);checkerror(status);RTPTime::Wait(RTPTime(1, 0));}sess.BYEDestroy(RTPTime(10, 0), 0, 0);return 0; }????????編譯后運(yùn)行如上,輸入本地 UDP 使用的端口以及對(duì)端監(jiān)聽的端口,設(shè)置需要發(fā)送的 RTP 包數(shù)即可發(fā)送,發(fā)送后接收端打印的信息如下。
總結(jié)
以上是生活随笔為你收集整理的使用JRTPLIB收发RTP数据包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件设计师教程---第一章计算机系统知识
- 下一篇: jrtplib java,jrtplib