`
cppmule
  • 浏览: 447085 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

开源RTP库JRTPLIB 初学

 
阅读更多
    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 Reference http://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;
}
分享到:
评论

相关推荐

    jrtplib 接收端

    jrtplib是一个开源的C++库,提供了RTP和RTCP(Real-time Control Protocol)的实现,方便开发者在各种平台上进行实时通信应用的开发。 **描述分析:** 描述中提到"基于qt4.8.6",意味着这个程序是用Qt 4.8.6版本的...

    使用JRTPLib基于RTP协议服务器与客户端传输文字的示例

    JRTPLib是一个用C++编写的开源库,它为开发者提供了方便的API来处理RTP数据包。 首先,我们要理解RTP协议的基本概念。RTP通常与RTCP(实时传输控制协议)一起使用,RTCP负责提供传输质量反馈,确保数据的稳定传输。...

    rtp程序及其中文文档(vc2005/vc6都可运行)

    JRTplib是一个常用的开源RTP库,它为C++程序员提供了方便的接口来实现RTP协议。 RTP协议是IETF定义的互联网标准,主要设计用于交互式多媒体应用,如VoIP、视频会议和在线游戏。RTP通常与RTCP(Real-time Control ...

    jrtplib-3.7.1

    标题“jrtplib-3.7.1”所指的是一款专门用于实现RTP(Real-time Transport Protocol)协议的开源库,版本号为3.7.1。RTP是一种广泛应用于实时数据传输,如音频、视频流的网络协议,它与RTCP(Real-time Control ...

    jrtplib 类库详细说明文档

    jrtplib是一个开源C++库,专门设计用于实现RTP协议,广泛应用于音视频通信、网络会议、在线教育等实时多媒体应用领域。 RTP是一种网络协议,主要用于在不可靠的网络环境中高效传输实时数据,如音频和视频流。...

    jrtplib3.11.1.zip

    jrtplib是一个开源的实时传输协议(RTP)库,由Jørgen S. Kamp开发,适用于C++编程语言。这个库提供了一个灵活且高效的框架,用于构建RTP应用程序,广泛应用于多媒体通信、网络视频会议和实时数据传输等领域。RTP是...

    RTP协议实现源代码

    在本项目中,"jrtplib-2.9"是一个开源库,实现了RTP协议,并且兼容Linux和Windows操作系统。 jrtplib是一个轻量级的C++库,它的核心功能包括: 1. **会话管理**:jrtplib提供了创建和管理RTP会话的功能。RTP会话是...

    JRTPLIB3.7.1源代码包及帮助文档和实例

    JRTPLIB是一个开源的实时传输协议库,主要用于流媒体开发。这个库由Jörg "JRTPLIB" Riege创建,它提供了一组API,使得开发者能够轻松地在他们的应用程序中实现RTP(Real-time Transport Protocol)功能。RTP是一种...

    基于RTP协议的H264流传输

    JRTPLIB是一个开源的C++库,用于实现RTP和RTCP协议。它提供了一组易于使用的API,使得开发者能够快速构建实时音视频传输应用程序。在"基于JRTPLIB的h.264流文件传输"中,我们需要理解如何将H.264编码的NAL单元包装到...

    jrtp协议源代码jrtplib和jthread

    JRTPLIB是一个开源的C++库,专门设计来实现RTP协议,而JThread则是一个轻量级的Java多线程库,用于简化线程管理和同步。 **RTP协议** RTP是IETF定义的一种网络协议,标准定义在RFC 3550中。它主要用于在不可靠的...

    jrtplib3.7.1+类库详细说明文档.rar

    jrtplib是一个开源的C++库,专注于提供可靠且高效的RTP(Real-time Transport Protocol)支持。RTP是一种广泛用于多媒体数据传输的互联网标准协议,例如音频和视频流。 jrtplib库的3.7.1版本包含了丰富的功能,包括但...

    JRTPLIB 的一些学习笔记

    JRTPLIB是一个开源库,专门用于实时传输协议(RTP)和实时控制协议(RTCP)的处理。这个库提供了丰富的功能,使得开发者能够轻松地在应用中集成音频、视频或其他实时数据的传输。在本文中,我们将深入探讨JRTPLIB ...

    jrtplib391_jthread131_file.rar_IP电话/视频会议_Visual_C++_

    标题中的“jrtplib391_jthread131_file.rar”表明这是一个关于RTP(实时传输协议)库的源代码包,其中包含了jrtplib版本3.9.1和jthread版本1.3.1的文件。RTP通常用于在IP网络上实时传输音频和视频数据,如IP电话和...

    易语言参考学习

    2. **JRTPLIB**:这是一个开源的C++库,用于实现RTP和RTCP协议。"jrtplib-3.7.1笔记--流程一遍 - heanyu的专栏 - 博客频道 - CSDN.NET.html"和"hy-jrtplib介绍 - 黑黑的大鲨鱼的日志 - 网易博客.html"提供了关于...

    Get_RTCP_RR.rar_Linux/Unix编程_Windows_Unix_

    JRTPLIB是一个开源C++库,由Jouni Malinen编写,它提供了在多个平台(包括Linux/Unix和Windows)上实现RTP和RTCP功能的接口。这个库简化了开发者处理RTP和RTCP任务的工作,使得开发人员可以专注于应用层逻辑,而无需...

Global site tag (gtag.js) - Google Analytics