开源RTP库JRTPLIB 深入浅出1

2023-11-27 08:18

本文主要是介绍开源RTP库JRTPLIB 深入浅出1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RTP是一个实时通讯网络协议,网络上的音视频传输可以用它来做,像QQ的语音聊天等都是使用这个。real 开发 的在线rm文件播放协议 rstp也是基于RTP协议,可以自己搜索一下, 在网上可找到“RTP 实时网络协议rfc3550.pdf” 文档,有详细介绍。

JRTPLIB 是一个开源的 RTP协议实现库,支持Windows和unix平台,应该也很多人用了,封装的类方式很不错。他的主页是 http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib ,

帮助文档:http://research.edm.uhasselt.be/jori/jrtplib/documentation/index.html

RTPSession Class Referencehttp://research.edm.uhasselt.be/jori/jrtplib/documentation/classRTPSession.html

从他主页上下载完整的 JRTPLIB   源码包下来解压就行了,不过JRTPLIB 用到了他的JThread库,在主页上可以找到,也把JThread 库下载下来就行了。

解压之后再examples 目录下有几个例子,我试了一下,example2.cpp 和example4.cpp 两个,刚好一个可以作为客户端,一个作为服务器端,在vc2003 中测试了一下。

首先建一个win32 console 项目,把 把JRTPLIB example2.cpp    和 example4.cpp 加进了,再把JRTPLIB   和 JThread 添加到工程中来。 在 include 目下中指定JRTPLIB    和 JThread 的src源码目录。下一步把工程属性中把 “Runtime Library” 改成“Multi-threaded Debug DLL (/MDd)” ,需要改成这个JThread 才能编译通过。最后包含一个 Ws2_32.lib 这个lib库,我是直接在example2.cpp 和example4.cpp 前面添加 #pragma comment (lib, "Ws2_32.lib") 这一句了,在工程属性修改应该一样的。

 

两个例子的代码如下也贴一下吧:

 

#pragma comment (lib, "Ws2_32.lib")

#include "rtpsession.h"
#include "rtppacket.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtpsessionparams.h"
#include "rtperrors.h"
#ifndef WIN32
#include <netinet/in.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
#endif // WIN32
#include "rtpsourcedata.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>

#ifdef RTP_SUPPORT_THREAD


This function checks if there was a RTP error. If so, it displays an error
message and exists.


void checkerror(int rtperr)
{
if (rtperr < 0)
{
   std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
   exit(-1);
}
}


The new class routine


class MyRTPSession : public RTPSession
{
protected:
void OnPollThreadStep();
void ProcessRTPPacket(const RTPSourceData &srcdat,const RTPPacket &rtppack);
};

void MyRTPSession::OnPollThreadStep()
{
BeginDataAccess();
  
check incoming packets
if (GotoFirstSourceWithData())
{
   do
   {
    RTPPacket *pack;
    RTPSourceData *srcdat;
   
    srcdat = GetCurrentSourceInfo();
   
    while ((pack = GetNextPacket()) != NULL)
    {
     ProcessRTPPacket(*srcdat,*pack);
     DeletePacket(pack);
    }
   } while (GotoNextSourceWithData());
}
  
EndDataAccess();
}

void MyRTPSession::ProcessRTPPacket(const RTPSourceData &srcdat,const RTPPacket &rtppack)
{
You can inspect the packet and the source's info here
std::cout << "Got packet " << rtppack.GetExtendedSequenceNumber() << " from SSRC " << srcdat.GetSSRC() << std::endl;
}


The main routine

int main(void)
{
#ifdef WIN32
WSADATA dat;
WSAStartup(MAKEWORD(2,2),&dat);
#endif // WIN32

MyRTPSession sess;
uint16_t portbase;
std::string ipstr;
int status,num;

         First, we'll ask for the necessary information
  
std::cout << "Enter local portbase:" << std::endl;
std::cin >> portbase;
std::cout << std::endl;

std::cout << std::endl;
std::cout << "Number of seconds you wish to wait:" << std::endl;
std::cin >> num;

Now, we'll create a RTP session, set the destination
and poll for incoming data.

RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;

IMPORTANT: The local timestamp unit MUST be set, otherwise
             RTCP Sender Report info will be calculated wrong
In this case, we'll be just use 8000 samples per second.
sessparams.SetOwnTimestampUnit(1.0/8000.0);  

transparams.SetPortbase(portbase);
status = sess.Create(sessparams,&transparams);
checkerror(status);

Wait a number of seconds
RTPTime::Wait(RTPTime(num,0));

sess.BYEDestroy(RTPTime(10,0),0,0);

#ifdef WIN32
WSACleanup();
#endif // WIN32
return 0;
}

#else

int main(void)
{
std::cerr << "Thread support is required for this example" << std::endl;
return 0;
}

#endif // RTP_SUPPORT_THREAD

 

 

=============================================================================

#pragma comment (lib, "Ws2_32.lib")

#include "rtpsession.h"
#include "rtpsessionparams.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtptimeutilities.h"
#include "rtppacket.h"
#include <stdlib.h>
#include <iostream>

int main(void)
{
#ifdef WIN32
WSADATA dat;
WSAStartup(MAKEWORD(2,2),&dat);
#endif // WIN32
  
RTPSession session;

RTPSessionParams sessionparams;
sessionparams.SetOwnTimestampUnit(1.0/8000.0);

   
RTPUDPv4TransmissionParams transparams;
transparams.SetPortbase(8000);
   
int status = session.Create(sessionparams,&transparams);
if (status < 0)
{
   std::cerr << RTPGetErrorString(status) << std::endl;
   exit(-1);
}

uint8_t localip[]={127,0,0,1};
RTPIPv4Address addr(localip,9000);

status = session.AddDestination(addr);
if (status < 0)
{
   std::cerr << RTPGetErrorString(status) << std::endl;
   exit(-1);
}

session.SetDefaultPayloadType(96);
session.SetDefaultMark(false);
session.SetDefaultTimestampIncrement(160);

uint8_t silencebuffer[160];
for (int i = 0 ; i < 160 ; i++)
   silencebuffer[i] = 128;

//RTPTime delay(0.020);
   RTPTime delay(3.000);
RTPTime starttime = RTPTime::CurrentTime();

bool done = false;
while (!done)
{
   status = session.SendPacket(silencebuffer,160);
   if (status < 0)
   {
    std::cerr << RTPGetErrorString(status) << std::endl;
    exit(-1);
   }
  
   session.BeginDataAccess();
   if (session.GotoFirstSource())
   {
    do
    {
     RTPPacket *packet;

     while ((packet = session.GetNextPacket()) != 0)
     {
      std::cout << "Got packet with "
               << "extended sequence number "
               << packet->GetExtendedSequenceNumber()
               << " from SSRC " << packet->GetSSRC()
               << std::endl;
      session.DeletePacket(packet);
     }
    } while (session.GotoNextSource());
   }
   session.EndDataAccess();
   
   RTPTime::Wait(delay);
  
   RTPTime t = RTPTime::CurrentTime();
   t -= starttime;
   if (t > RTPTime(60.0))
    done = true;
}

delay = RTPTime(10.0);
session.BYEDestroy(delay,"Time's up",9);

#ifdef WIN32
WSACleanup();
#endif // WIN32
return 0;
}

 

文章出处:http://blog.sina.com.cn/s/blog_4b8036dd0100bh3y.html

这篇关于开源RTP库JRTPLIB 深入浅出1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/427357

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互

开源Apache服务器安全防护技术精要及实战

Apache 服务简介   Web服务器也称为WWW服务器或HTTP服务器(HTTPServer),它是Internet上最常见也是使用最频繁的服务器之一,Web服务器能够为用户提供网页浏览、论坛访问等等服务。   由于用户在通过Web浏览器访问信息资源的过程中,无须再关心一些技术性的细节,而且界面非常友好,因而Web在Internet上一推出就得到了爆炸性的发展。现在Web服务器已

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc