linux下RTP编程(使用JRTPLIB)(转)
随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡。目前在网络上传输音频/视频 (Audio/Video,简称A/V)等多媒体文件时,基本上只有下载和流式传输两种选择。通常说来,A/V文件占据的存储空间都比较大,在带宽受限的 网络环境中下载可能要耗费数分钟甚至数小时,所以这种处理方法的延迟很大。如果换用流式传输的话,声音、影像、动画等多媒体文件将由专门的流媒体服务器负 责向用户连续、实时地发送,这样用户可以不必等到整个文件全部下载完毕,而只需要经过几秒钟的启动延时就可以了,当这些多媒体数据在客户机上播放时,文件 的剩余部分将继续从流媒体服务器下载。
实 时传输协议(Real-time Transport Protocol,PRT)是在Internet上处理多媒体数据流的一种网络协议,利用它能够在一对一(unicast,单播)或者一对多 (multicast,多播)的网络环境中实现传流媒体数据的实时传输。RTP通常使用UDP来进行多媒体数据的传输,但如果需要的话可以使用TCP或者 ATM等其它协议,整个RTP协议由两个密切相关的部分组成:RTP数据协议和RTP控制协议。实时流协议(Real Time Streaming Protocol,RTSP)最早由Real Networks和Netscape公司共同提出,它位于RTP和RTCP之上,其目的是希望通过IP网络有效地传输多媒体数据。
图1 RTP头部格式
- CSRC记数(CC) 表示CSRC标识的数目。CSRC标识紧跟在RTP固定头部之后,用来表示RTP数据报的来源,RTP协议允许在同一个会话中存在多个数据源,它们可以 通过RTP混合器合并为一个数据源。例如,可以产生一个CSRC列表来表示一个电话会议,该会议通过一个 RTP混合器将所有讲话者的语音数据组合为一个RTP数据源。
- 负载类型(PT) 标明RTP负载的格式,包括所采用的编码算法、采样频率、承载通道等。例如,类型2表明该RTP数据包中承载的是用ITU G.721算法编码的语音数据,采样频率为8000Hz,并且采用单声道。
- 序列号 用来为接收方提供探测数据丢失的方法,但如何处理丢失的数据则是应用程序自己的事情,RTP协议本身并不负责数据的重传。
- 时间戳 记录了负载中第一个字节的采样时间,接收方能够时间戳能够确定数据的到达是否受到了延迟抖动的影响,但具体如何来补偿延迟抖动则是应用程序自己的事情。
图2 RTP与各种网络协议的关系
- SR 发送端报告,所谓发送端是指发出RTP数据报的应用程序或者终端,发送端同时也可以是接收端。
- RR 接收端报告,所谓接收端是指仅接收但不发送RTP数据报的应用程序或者终端。
- SDES 源描述,主要功能是作为会话成员有关标识信息的载体,如用户名、邮件地址、电话号码等,此外还具有向会话成员传达会话控制信息的功能。
- BYE 通知离开,主要功能是指示某一个或者几个源不再有效,即通知会话中的其他成员自己将退出会话。
- APP 由应用程序自己定义,解决了RTCP的扩展性问题,并且为协议的实现者提供了很大的灵活性。
- 检索媒体 允许用户通过HTTP或者其它方法向媒体服务器提交一个表示描述。如表示是组播的,则表示描述就包含用于该媒体流的组播地址和端口号;如果表示是单播的,为了安全在表示描述中应该只提供目的地址。
- 邀请加入 媒体服务器可以被邀请参加正在进行的会议,或者在表示中回放媒体,或者在表示中录制全部媒体或其子集,非常适合于分布式教学。
- 添加媒体 通知用户新加入的可利用媒体流,这对现场讲座来讲显得尤其有用。与HTTP/1.1类似,RTSP请求也可以交由代理、通道或者缓存来进行处理。
RTP 是目前解决流媒体实时传输问题的最好办法,如果需要在Linux平台上进行实时流媒体编程,可以考虑使用一些开放源代码的RTP库,如LIBRTP、 JRTPLIB等。JRTPLIB是一个面向对象的RTP库,它完全遵循RFC 1889设计,在很多场合下是一个非常不错的选择,下面就以JRTPLIB为例,讲述如何在Linux平台上运用RTP协议进行实时流媒体编程。
[root@linuxgam src]# bzip2 -dc jrtplib-2.7b.tar.bz2 | tar xvf - |
[root@linuxgam src]# cd jrtplib-2.7 [root@linuxgam jrtplib-2.7b]# ./configure [root@linuxgam jrtplib-2.7b]# make |
[root@linuxgam jrtplib-2.7b]# make install |
#include "rtpsession.h"int main(void) {RTPSession sess;sess.Create(5000);return 0; } |
#include <stdio.h> #include "rtpsession.h"int main(void) {RTPSession sess;int status;char* msg;sess.Create(6000);msg = RTPGetErrorString(status);printf("Error String: %s\\n", msg);return 0; } |
sess.SetTimestampUnit(1.0/8000.0); |
unsigned long addr = ntohl(inet_addr("127.0.0.1")); sess.AddDestination(addr, 6000); |
int SendPacket(void *data,int len) int SendPacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc) int SendPacket(void *data,int len,unsigned short hdrextID,void *hdrextdata,int numhdrextwords) int SendPacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc,unsigned short hdrextID,void *hdrextdata,int numhdrextwords) |
sess.SendPacket(buffer, 5, 0, false, 10); |
sess.SetDefaultPayloadType(0); sess.SetDefaultMark(false); sess.SetDefaultTimeStampIncrement(10); |
sess.SendPacket(buffer, 5); |
if (sess.GotoFirstSourceWithData()) {do {RTPPacket *pack; pack = sess.GetNextPacket(); // 处理接收到的数据delete pack;} while (sess.GotoNextSourceWithData()); } |
- RECEIVEMODE_ALL 缺省的接收模式,所有到达的RTP数据报都将被接受;
- RECEIVEMODE_IGNORESOME 除了某些特定的发送者之外,所有到达的RTP数据报都将被接受,而被拒绝的发送者列表可以通过调用AddToIgnoreList()、DeleteFromIgnoreList()和ClearIgnoreList()方法来进行设置;
- RECEIVEMODE_ACCEPTSOME 除了某些特定的发送者之外,所有到达的RTP数据报都将被拒绝,而被接受的发送者列表可以通过调用AddToAcceptList ()、DeleteFromAcceptList和ClearAcceptList ()方法来进行设置。
sess.SetLocalEMail(" xiaowp@linuxgam.comxiaowp@linuxgam.com",19); |
#include <stdio.h> #include <string.h> #include "rtpsession.h"// 错误处理函数 void checkerror(int err) {if (err < 0) {char* errstr = RTPGetErrorString(err);printf("Error:%s\\n", errstr);exit(-1);} }int main(int argc, char** argv) {RTPSession sess;unsigned long destip;int destport;int portbase = 6000;int status, index;char buffer[128];if (argc != 3) {printf("Usage: ./sender destip destport\\n");return -1;}// 获得接收端的IP地址和端口号destip = inet_addr(argv[1]);if (destip == INADDR_NONE) {printf("Bad IP address specified.\\n");return -1;}destip = ntohl(destip);destport = atoi(argv[2]);// 创建RTP会话status = sess.Create(portbase);checkerror(status);// 指定RTP数据接收端status = sess.AddDestination(destip, destport);checkerror(status);// 设置RTP会话默认参数sess.SetDefaultPayloadType(0);sess.SetDefaultMark(false);sess.SetDefaultTimeStampIncrement(10);// 发送流媒体数据index = 1;do {sprintf(buffer, "%d: RTP packet", index ++);sess.SendPacket(buffer, strlen(buffer));printf("Send packet !\\n");} while(1);return 0; } |
#include <stdio.h> #include "rtpsession.h" #include "rtppacket.h"// 错误处理函数 void checkerror(int err) {if (err < 0) {char* errstr = RTPGetErrorString(err);printf("Error:%s\\n", errstr);exit(-1);} }int main(int argc, char** argv) {RTPSession sess;int localport;int status;if (argc != 2) {printf("Usage: ./sender localport\\n");return -1;}// 获得用户指定的端口号localport = atoi(argv[1]);// 创建RTP会话status = sess.Create(localport);checkerror(status);do {// 接受RTP数据status = sess.PollData();// 检索RTP数据源if (sess.GotoFirstSourceWithData()) {do {RTPPacket* packet;// 获取RTP数据报while ((packet = sess.GetNextPacket()) != NULL) {printf("Got packet !\\n");// 删除RTP数据报delete packet;}} while (sess.GotoNextSourceWithData());}} while(1);return 0; } |
随 着多媒体数据在Internet上所承担的作用变得越来越重要,需要实时传输音频和视频等多媒体数据的场合也将变得越来越多,如IP电话、视频点播、在线 会议等。RTP是用来在Internet上进行实时流媒体传输的一种协议,目前已经被广泛地应用在各种场合,JRTPLIB是一个面向对象的RTP封装 库,利用它可以很方便地完成Linux平台上的实时流媒体编程。
- 1. 在JRTPLIB的网站http://lumumba.luc.ac.be/jori/jrtplib/jrtplib.html上,可以下载到JRTPLIB最新的源码包,并且还能找到一些与RTP相关的资源。
- 2. 顾淑珍等编著,宽带增值服务开发实例,北京:机械工业出版社,2002
- 3. 黄永峰等编著,IP网络多媒体通信技术,北京:人民邮电出版社,2003
注:本文作者:肖文鹏 摘自:developerWorks 中国
posted on 2006-03-30 21:37 soochow_hhb 以java论成败 以架构论英雄 阅读(3215) 评论(1) 编辑 收藏 所属分类: Reading
linux下RTP编程(使用JRTPLIB)(转)相关推荐
- linux下RTP编程(使用JRTPLIB)
流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议.IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关键 ...
- Linux下RTP编程(上)
流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议.IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关键 ...
- linux下C++编程学习
前言(废话,可略过):之前一直在windows下做C++编程,后来换后台工作接触到linux下C++开发.期间磨磨唧唧浪费了很多时间.记录下历程,给后来的小伙伴提个醒,免得浪费宝贵时间. 一.关于换系 ...
- Linux下Socket编程
Linux下Socket编程 网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S ...
- Linux下高性能网络编程中的几个TCP/IP选项
Linux下高性能网络编程中的几个TCP/IP选项 转自:http://blog.chinaunix.net/u/12592/showart.php?id=2064847 最近在新的平台上测试程序,以 ...
- linux下多进程编程简介
两年前的文章,拿过来充充门面. ------------------------ linux下多进程编程简介 ( 作者:mikespook | 发布日期:2002-12-8 | 浏览次数:272 ) ...
- [zz]Linux 下 socket 编程示例
本示例为 Client/Server 结构,通过代码演示 Client 如何建立连接,并向远程端发送数据:Server 端如何侦听系统连接请求,接收请求并建立连接,进而获取客户端发来的数据.代码虽短, ...
- Linux下网络编程
Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...
- linux下 C编程改变输出字体颜色
linux下 C编程改变输出字体颜色 分类: Linux基础编程 Linux操作系统 2012-09-19 10:53 1409人阅读 评论(0) 收藏 举报 linux编程c 格式: echo &q ...
最新文章
- Android Studio 3.5 之后导入第三方Library 库的方法
- 零基础入门学习Pyhton(23)字典:当索引不好用时
- 是谁在调用我?使用 arthas+jprofiler 做复杂链路分析
- Windows中使用wget整站下载
- 收藏 | 使用 Mask-RCNN 在实例分割应用中克服过拟合
- 《游戏大师Chris Crawford谈互动叙事》一1.2 两种思维方式
- 学校管理 学生会管理系统(SSM)vue+ssm+shiro
- 【MFC开发(7)】编辑框控件Edit Control
- WinHex license添加(v19测试可用)
- webservice接口开发经历
- 三种中介效应检验方法及操作步骤
- [安卓逆向]安卓逆向-一次简单的静态分析
- 嵌入式产品软件(固件)开发需要考虑的2个方面
- 如何删除360奇安信软件
- c#获取公网的ip,本机ip 以及当前城市以及运营商
- 介绍一个成功的 Git 分支模型——终于知道如何管理git分支了(好文章!!强烈建议看本文的英文原文)
- 30V N通道 MOS管SOT23-6封装 安森德ASDM6802ZC替代AOS万代AO6802方案
- hashSHA256加密
- 简书python_第一篇简书-Python入门
- 导出Excel之Epplus使用教程2(样式设置)