日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用JRTPLIB收发RTP数据包

發布時間:2024/8/1 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用JRTPLIB收发RTP数据包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 前言

????????JRTPLIB 是 C++ 語言編寫的 RTP 庫,它幫助我們封裝了 RTP 協議細節,用戶通過提供好的接口可以設置 RTP 包信息并發送到指定地址,也可以接收 RTP 包取出信息。

????????本文僅介紹如何使用 JRTPLIB 發送/接收 RTP 數據包,我在這篇博客又介紹了如何使用 JRTPLIB 構造 RTP 數據包來荷載 H264 碼流數據。

二. 下載編譯安裝

git clone https://github.com/j0r1/JRTPLIB.git cd JRTPLIB cmake CMakeLists.txt make sudo make install

三. 代碼實戰

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; }

編譯后運行如上,設置本地監聽端口后就會開始等待 RTP 數據。

2. 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;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; }

????????編譯后運行如上,輸入本地 UDP 使用的端口以及對端監聽的端口,設置需要發送的 RTP 包數即可發送,發送后接收端打印的信息如下。

總結

以上是生活随笔為你收集整理的使用JRTPLIB收发RTP数据包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。