当前位置: 首页 > news >正文

哪个网站可以做条形码网站设计培训成都哪家好

哪个网站可以做条形码,网站设计培训成都哪家好,网站导航建设注意,镇江网站制作一、流媒体简介 随着Internet的日益普及#xff0c;在网络上传输的数据已经不再局限于文字和图形#xff0c;而是逐渐向声音和视频等多媒体格式过渡。目前在网络上传输音频/视频#xff08;Audio/Video#xff0c;简称A/V#xff09;等多媒体文件时#xff0c;基本上只有… 一、流媒体简介 随着Internet的日益普及在网络上传输的数据已经不再局限于文字和图形而是逐渐向声音和视频等多媒体格式过渡。目前在网络上传输音频/视频Audio/Video简称A/V等多媒体文件时基本上只有下载和流式传输两种选择。通常说来A/V文件占据的存储空间都比较大在带宽受限的网络环境中下载可能要耗费数分钟甚至数小时所以这种处理方法的延迟很大。如果换用流式传输的话声音、影像、动画等多媒体文件将由专门的流媒体服务器负责向用户连续、实时地发送这样用户可以不必等到整个文件全部下载完毕而只需要经过几秒钟的启动延时就可以了当这些多媒体数据在客户机上播放时文件的剩余部分将继续从流媒体服务器下载。 流Streaming是近年在Internet上出现的新概念其定义非常广泛主要是指通过网络传输多媒体数据的技术总称。流媒体包含广义和狭义两种内涵广义上的流媒体指的是使音频和视频形成稳定和连续的传输流和回放流的一系列技术、方法和协议的总称即流媒体技术狭义上的流媒体是相对于传统的下载-回放方式而言的指的是一种从Internet上获取音频和视频等多媒体数据的新方法它能够支持多媒体数据流的实时传输和实时播放。通过运用流媒体技术服务器能够向客户机发送稳定和连续的多媒体数据流客户机在接收数据的同时以一个稳定的速率回放而不用等数据全部下载完之后再进行回放。 由于受网络带宽、计算机处理能力和协议规范等方面的限制要想从Internet上下载大量的音频和视频数据无论从下载时间和存储空间上来讲都是不太现实的而流媒体技术的出现则很好地解决了这一难题。目前实现流媒体传输主要有两种方法顺序流progressive streaming传输和实时流realtimestreaming传输它们分别适合于不同的应用场合。 顺序流传输 顺序流传输采用顺序下载的方式进行传输在下载的同时用户可以在线回放多媒体数据但给定时刻只能观看已经下载的部分不能跳到尚未下载的部分也不能在传输期间根据网络状况对下载速度进行调整。由于标准的HTTP服务器就可以发送这种形式的流媒体而不需要其他特殊协议的支持因此也常常被称作HTTP流式传输。顺序流式传输比较适合于高质量的多媒体片段如片头、片尾或者广告等。 实时流传输 实时流式传输保证媒体信号带宽能够与当前网络状况相匹配从而使得流媒体数据总是被实时地传送因此特别适合于现场事件。实时流传输支持随机访问即用户可以通过快进或者后退操作来观看前面或者后面的内容。从理论上讲实时流媒体一经播放就不会停顿但事实上仍有可能发生周期性的暂停现象尤其是在网络状况恶化时更是如此。与顺序流传输不同的是实时流传输需要用到特定的流媒体服务器而且还需要特定网络协议的支持。 回页首 二、流媒体协议 实时传输协议Real-time TransportProtocolPRT是在Internet上处理多媒体数据流的一种网络协议利用它能够在一对一unicast单播或者一对多multicast多播的网络环境中实现传流媒体数据的实时传输。RTP通常使用UDP来进行多媒体数据的传输但如果需要的话可以使用TCP或者ATM等其它协议整个RTP协议由两个密切相关的部分组成RTP数据协议和RTP控制协议。实时流协议Real TimeStreaming ProtocolRTSP最早由RealNetworks和Netscape公司共同提出它位于RTP和RTCP之上其目的是希望通过IP网络有效地传输多媒体数据。 2.1 RTP数据协议 RTP数据协议负责对流媒体数据进行封包并实现媒体流的实时传输每一个RTP数据报都由头部Header和负载Payload两个部分组成其中头部前12个字节的含义是固定的而负载则可以是音频或者视频数据。RTP数据报的头部格式如图1所示 图1 RTP头部格式 其中比较重要的几个域及其意义如下 CSRC记数CC  表示CSRC标识的数目。CSRC标识紧跟在RTP固定头部之后用来表示RTP数据报的来源RTP协议允许在同一个会话中存在多个数据源它们可以通过RTP混合器合并为一个数据源。例如可以产生一个CSRC列表来表示一个电话会议该会议通过一个RTP混合器将所有讲话者的语音数据组合为一个RTP数据源。 负载类型PT  标明RTP负载的格式包括所采用的编码算法、采样频率、承载通道等。例如类型2表明该RTP数据包中承载的是用ITUG.721算法编码的语音数据采样频率为8000Hz并且采用单声道。 序列号  用来为接收方提供探测数据丢失的方法但如何处理丢失的数据则是应用程序自己的事情RTP协议本身并不负责数据的重传。 时间戳  记录了负载中第一个字节的采样时间接收方能够时间戳能够确定数据的到达是否受到了延迟抖动的影响但具体如何来补偿延迟抖动则是应用程序自己的事情。 从RTP数据报的格式不难看出它包含了传输媒体的类型、格式、序列号、时间戳以及是否有附加数据等信息这些都为实时的流媒体传输提供了相应的基础。RTP协议的目的是提供实时数据如交互式的音频和视频的端到端传输服务因此在RTP中没有连接的概念它可以建立在底层的面向连接或面向非连接的传输协议之上RTP也不依赖于特别的网络地址格式而仅仅只需要底层传输协议支持组帧Framing和分段Segmentation就足够了另外RTP本身还不提供任何可靠性机制这些都要由传输协议或者应用程序自己来保证。在典型的应用场合下RTP一般是在传输协议之上作为应用程序的一部分加以实现的如图2所示 图2 RTP与各种网络协议的关系 2.2 RTCP控制协议 RTCP控制协议需要与RTP数据协议一起配合使用当应用程序启动一个RTP会话时将同时占用两个端口分别供RTP和RTCP使用。RTP本身并不能为按序传输数据包提供可靠的保证也不提供流量控制和拥塞控制这些都由RTCP来负责完成。通常RTCP会采用与RTP相同的分发机制向会话中的所有成员周期性地发送控制信息应用程序通过接收这些数据从中获取会话参与者的相关资料以及网络状况、分组丢失概率等反馈信息从而能够对服务质量进行控制或者对网络状况进行诊断。 RTCP协议的功能是通过不同的RTCP数据报来实现的主要有如下几种类型 SR  发送端报告所谓发送端是指发出RTP数据报的应用程序或者终端发送端同时也可以是接收端。 RR  接收端报告所谓接收端是指仅接收但不发送RTP数据报的应用程序或者终端。 SDES  源描述主要功能是作为会话成员有关标识信息的载体如用户名、邮件地址、电话号码等此外还具有向会话成员传达会话控制信息的功能。 BYE  通知离开主要功能是指示某一个或者几个源不再有效即通知会话中的其他成员自己将退出会话。 APP  由应用程序自己定义解决了RTCP的扩展性问题并且为协议的实现者提供了很大的灵活性。 RTCP数据报携带有服务质量监控的必要信息能够对服务质量进行动态的调整并能够对网络拥塞进行有效的控制。由于RTCP数据报采用的是多播方式因此会话中的所有成员都可以通过RTCP数据报返回的控制信息来了解其他参与者的当前情况。 在一个典型的应用场合下发送媒体流的应用程序将周期性地产生发送端报告SR该RTCP数据报含有不同媒体流间的同步信息以及已经发送的数据报和字节的计数接收端根据这些信息可以估计出实际的数据传输速率。另一方面接收端会向所有已知的发送端发送接收端报告RR该RTCP数据报含有已接收数据报的最大序列号、丢失的数据报数目、延时抖动和时间戳等重要信息发送端应用根据这些信息可以估计出往返时延并且可以根据数据报丢失概率和时延抖动情况动态调整发送速率以改善网络拥塞状况或者根据网络状况平滑地调整应用程序的服务质量。 2.3 RTSP实时流协议 作为一个应用层协议RTSP提供了一个可供扩展的框架它的意义在于使得实时流媒体数据的受控和点播变得可能。总的说来RTSP是一个流媒体表示协议主要用来控制具有实时特性的数据发送但它本身并不传输数据而是必须依赖于下层传输协议所提供的某些服务。RTSP可以对流媒体提供诸如播放、暂停、快进等操作它负责定义具体的控制消息、操作方法、状态码等此外还描述了与RTP间的交互操作。 RTSP在制定时较多地参考了HTTP/1.1协议甚至许多描述与HTTP/1.1完全相同。RTSP之所以特意使用与HTTP/1.1类似的语法和操作在很大程度上是为了兼容现有的Web基础结构正因如此HTTP/1.1的扩展机制大都可以直接引入到RTSP中。 由RTSP控制的媒体流集合可以用表示描述PresentationDescription来定义所谓表示是指流媒体服务器提供给客户机的一个或者多个媒体流的集合而表示描述则包含了一个表示中各个媒体流的相关信息如数据编码/解码算法、网络地址、媒体流的内容等。 虽然RTSP服务器同样也使用标识符来区别每一流连接会话Session但RTSP连接并没有被绑定到传输层连接如TCP等也就是说在整个RTSP连接期间RTSP用户可打开或者关闭多个对RTSP服务器的可靠传输连接以发出RTSP 请求。此外RTSP连接也可以基于面向无连接的传输协议如UDP等。 RTSP协议目前支持以下操作 检索媒体  允许用户通过HTTP或者其它方法向媒体服务器提交一个表示描述。如表示是组播的则表示描述就包含用于该媒体流的组播地址和端口号如果表示是单播的为了安全在表示描述中应该只提供目的地址。 邀请加入  媒体服务器可以被邀请参加正在进行的会议或者在表示中回放媒体或者在表示中录制全部媒体或其子集非常适合于分布式教学。 添加媒体  通知用户新加入的可利用媒体流这对现场讲座来讲显得尤其有用。与HTTP/1.1类似RTSP请求也可以交由代理、通道或者缓存来进行处理。 回页首 三、流媒体编程 RTP是目前解决流媒体实时传输问题的最好办法如果需要在Linux平台上进行实时流媒体编程可以考虑使用一些开放源代码的RTP库如LIBRTP、JRTPLIB等。JRTPLIB是一个面向对象的RTP库它完全遵循RFC1889设计在很多场合下是一个非常不错的选择下面就以JRTPLIB为例讲述如何在Linux平台上运用RTP协议进行实时流媒体编程。 3.1 环境搭建 JRTPLIB是一个用C语言实现的RTP库目前已经可以运行在Windows、Linux、FreeBSD、Solaris、Unix和VxWorks等多种操作系统上。要为Linux系统安装JRTPLIB首先从JRTPLIB的网站http://lumumba.luc.ac.be/jori/jrtplib/jrtplib.html下载最新的源码包此处使用的是jrtplib-2.7b.tar.bz2。假设下载后的源码包保存在/usr/local/src目录下执行下面的命令可以对其进行解压缩 [rootlinuxgam src]# bzip2 -dc jrtplib-2.7b.tar.bz2 | tar xvf- 接下去需要对JRTPLIB进行配置和编译[rootlinuxgam src]# cd jrtplib-2.7 [rootlinuxgam jrtplib-2.7b]# ./configure [rootlinuxgam jrtplib-2.7b]# make 最后再执行如下命令就可以完成JRTPLIB的安装[rootlinuxgam jrtplib-2.7b]# makeinstall 3.2 初始化 在使用JRTPLIB进行实时流媒体数据传输之前首先应该生成RTPSession类的一个实例来表示此次RTP会话然后调用Create()方法来对其进行初始化操作。RTPSession类的Create()方法只有一个参数用来指明此次RTP会话所采用的端口号。清单1给出了一个最简单的初始化框架它只是完成了RTP会话的初始化工作还不具备任何实际的功能。 代码清单1initial.cpp #include rtpsession.h int main(void) { RTPSession sess; sess.Create(5000); return 0; } 如果RTP会话创建过程失败Create()方法将会返回一个负数通过它虽然可以很容易地判断出函数调用究竟是成功的还是失败的但却很难明白出错的原因到底什么。JRTPLIB采用了统一的错误处理机制它提供的所有函数如果返回负数就表明出现了某种形式的错误而具体的出错信息则可以通过调用RTPGetErrorString()函数得到。RTPGetErrorString()函数将错误代码作为参数传入然后返回该错误代码所对应的错误信息。清单2给出了一个更加完整的初始化框架它可以对RTP会话初始化过程中所产生的错误进行更好的处理 代码清单2framework.cpp #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; } 设置恰当的时戳单元是RTP会话初始化过程所要进行的另外一项重要工作这是通过调用RTPSession类的SetTimestampUnit()方法来实现的该方法同样也只有一个参数表示的是以秒为单元的时戳单元。例如当使用RTP会话传输8000Hz采样的音频数据时由于时戳每秒钟将递增8000所以时戳单元相应地应该被设置成1/8000sess.SetTimestampUnit(1.0/8000.0); 3.3 数据发送 当RTP会话成功建立起来之后接下去就可以开始进行流媒体数据的实时传输了。首先需要设置好数据发送的目标地址RTP协议允许同一会话存在多个目标地址这可以通过调用RTPSession类的AddDestination()、DeleteDestination()和ClearDestinations()方法来完成。例如下面的语句表示的是让RTP会话将数据发送到本地主机的6000端口unsignedlong addr ntohl(inet_addr(127.0.0.1)); sess.AddDestination(addr, 6000); 目标地址全部指定之后接着就可以调用RTPSession类的SendPacket()方法向所有的目标地址发送流媒体数据。SendPacket()是RTPSession类提供的一个重载函数它具有下列多种形式int SendPacket(void *data,intlen) int SendPacket(void *data,int len,unsigned char pt,boolmark,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,boolmark,unsigned long timestampinc, unsigned short hdrextID,void *hdrextdata,int numhdrextwords) SendPacket()最典型的用法是类似于下面的语句其中第一个参数是要被发送的数据而第二个参数则指明将要发送数据的长度再往后依次是RTP负载类型、标识和时戳增量。sess.SendPacket(buffer,5, 0, false, 10); 对 于同一个RTP会话来讲负载类型、标识和时戳增量通常来讲都是相同的JRTPLIB允许将它们设置为会话的默认参数这是通过调用RTPSession类的SetDefaultPayloadType()、SetDefaultMark()和SetDefaultTimeStampIncrement()方法来完成的。为RTP会话设置这些默认参数的好处是可以简化数据的发送例如如果为RTP会话设置了默认参数sess.SetDefaultPayloadType(0); sess.SetDefaultMark(false); sess.SetDefaultTimeStampIncrement(10); 之后在进行数据发送时只需指明要发送的数据及其长度就可以了sess.SendPacket(buffer, 5); 3.4 数据接收 对于流媒体数据的接收端首先需要调用RTPSession类的PollData()方法来接收发送过来的RTP或者RTCP数据报。由于同一个RTP会话中允许有多个参与者源你既可以通过调用RTPSession类的GotoFirstSource()和GotoNextSource()方法来遍历所有的源也可以通过调用RTPSession类的GotoFirstSourceWithData()和GotoNextSourceWithData()方法来遍历那些携带有数据的源。在从RTP会话中检测出有效的数据源之后接下去就可以调用RTPSession类的GetNextPacket()方法从中抽取RTP数据报当接收到的RTP数据报处理完之后一定要记得及时释放。下面的代码示范了该如何对接收到的RTP数据报进行处理 if (sess.GotoFirstSourceWithData()) { do { RTPPacket *pack; pack sess.GetNextPacket(); // 处理接收到的数据 delete pack; } while (sess.GotoNextSourceWithData()); } JRTPLIB为RTP数据报定义了三种接收模式其中每种接收模式都具体规定了哪些到达的RTP数据报将会被接受而哪些到达的RTP数据报将会被拒绝。通过调用RTPSession类的SetReceiveMode()方法可以设置下列这些接收模式 RECEIVEMODE_ALL  缺省的接收模式所有到达的RTP数据报都将被接受 RECEIVEMODE_IGNORESOME  除了某些特定的发送者之外所有到达的RTP数据报都将被接受而被拒绝的发送者列表可以通过调用AddToIgnoreList()、DeleteFromIgnoreList()和ClearIgnoreList()方法来进行设置 RECEIVEMODE_ACCEPTSOME  除了某些特定的发送者之外所有到达的RTP数据报都将被拒绝而被接受的发送者列表可以通过调用AddToAcceptList()、DeleteFromAcceptList和ClearAcceptList ()方法来进行设置。 3.5 控制信息 JRTPLIB是一个高度封装后的RTP库程序员在使用它时很多时候并不用关心RTCP数据报是如何被发送和接收的因为这些都可以由JRTPLIB自己来完成。只要PollData()或者SendPacket()方法被成功调用JRTPLIB就能够自动对到达的RTCP数据报进行处理并且还会在需要的时候发送RTCP数据报从而能够确保整个RTP会话过程的正确性。 而另一方面通过调用RTPSession类提供的SetLocalName()、SetLocalEMail()、SetLocalLocation()、SetLocalPhone()、SetLocalTool()和SetLocalNote()方法JRTPLIB又允许程序员对RTP会话的控制信息进行设置。所有这些方法在调用时都带有两个参数其中第一个参数是一个char型的指针指向将要被设置的数据而第二个参数则是一个int型的数值表明该数据中的前面多少个字符将会被使用。例如下面的语句可以被用来设置控制信息中的电子邮件地址sess.SetLocalEMail(xiaowplinuxgam.com,19); 在RTP会话过程中不是所有的控制信息都需要被发送通过调用RTPSession类提供的EnableSendName()、EnableSendEMail()、EnableSendLocation()、EnableSendPhone()、EnableSendTool()和EnableSendNote()方法可以为当前RTP会话选择将被发送的控制信息。 3.6 实际应用 最后通过一个简单的流媒体发送-接收实例介绍如何利用JRTPLIB来进行实时流媒体的编程。清单3给出了数据发送端的完整代码它负责向用户指定的IP地址和端口不断地发送RTP数据包 代码清单3sender.cpp #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; } 清单4则给出了数据接收端的完整代码它负责从指定的端口不断地读取RTP数据包 代码清单4receiver.cpp#includestdio.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相关的资源。
http://www.sadfv.cn/news/54480/

相关文章:

  • 网站建设 需求高级前端开发在线培训
  • 做网站怎么租个空间wordpress全部文件
  • 淮阳网站建设做海岛旅游类网站的背景及意义
  • ae做的动效怎么放在网站上哈尔滨信息工程学院
  • 建设银行网站查询重庆市造价工程信息网官网
  • 网站快照历史建湖县住房和城乡建设局网站
  • 网站not foundwordpress默认居中
  • 五金网站方案c 做网站看什么书
  • 网站域名登录不了一个店铺的运营方案
  • 茂名seo站内优化图片制作器手机版
  • 西安网站建设gjwordpress 关闭访问
  • wordpress 仿站 教程网网站设计酷站
  • 软件制作网站网站开发软件有哪些免费
  • 做代练网站能备案网站做两个月百度没有录取
  • 怎样制作个人网站wordpress jekyll
  • 网站高端网站建设东莞有哪些网络有限公司
  • 汕头seo网站管理龙岩做网站龙岩网页设计
  • 购物网站修改注册信息模块的分析php开源网站管理系统
  • 个人建什么样的网站好wordpress猜你喜欢
  • 织梦网站修改教程视频上海十大建筑设计公司
  • 爱唐山做贡献月评十佳投票网站直接做的视频网站
  • 阳西县住房和城乡建设部网站wordpress超级大菜单如何使用
  • 数码网站建设维护大型网站建设报价
  • html5 服装网站新建的网站百度多久才会收录
  • 高效网站推广费用软件开发公司简介模板免费
  • 绍兴做网站建设重庆属于哪个省
  • 网站换服务器怎么做备份网站建设中的主要功能
  • 假网站连接怎么做的网站首页设计收费
  • 国外设计网站欣赏网页特效代码网站
  • 织梦做的网站用什么数据库微信小程序原生开发