欢迎来到天天文库
浏览记录
ID:479628
大小:541.00 KB
页数:41页
时间:2017-08-09
《流媒体播放系统设计【计算机科学专业】【毕业设计+文献综述+开题报告】》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
(20届)本科毕业论文流媒体播放系统设计V 摘要:随着互联网的普及,利用网络传播声音与视频的需求越来越大,人们普遍希望能够在网上看到更加直观生动的媒体演示,但又不得不面对音视频传输所需要的大量时间,而流媒体技术凭借其流式传输的特点使用户可以在线欣赏到连续不断的较高品质的音频与视频节目。本课题利用eclipse功能强大的集成开发环境,使用Java语言与Java媒体框架,开发了一个能收发并播放流媒体文件的播放系统,通过此播放器,用户可以观看本地或者流媒体文件,并能从中体会到为无限乐趣。关键词:流媒体;播放;传输V DesignofStreamingmediasystemAbstract:WiththepopularityoftheInternet,thereisagrowingneedtousenetworktransmitvideoandaudio,Itisgenerallyhopetoseemoreintuitiveonlinemediavividdemonstration,butpeoplehadtofacetheaudioandvideotransmissionneedslotsoftime,however,streamingmediatechnologywithitsstreamingonlinefeaturesallowsusertoenjoycontinuoushigh-qualityaudioandvideoprograms.Thissubjectusingeclipsewhichprovidesapowerfulintegrateddevelopmentplatform,JavaandJMF,todeveloptheStreamingmedia systemwhichcanreceiveandtransmitandplaythemedia.Usingthisplatform,userscanwatchlocalmediasorStreamingmedia,andtheycanenjoyalotoffunfromthepurchaseactivityonline.Keywords:Streamingmedia;Play;TransmissionV 目录1绪论11.1课题的研究背景11.1.1流媒体技术简介11.1.2流媒体技术的迅速发展11.2课题研究的目的与意义11.3课题的研究内容21.4课题的研究方法21.5论文的内容组织22基础知识简介32.1Java简介32.2Java媒体框架(JMF)简介32.2.1JMF体系结构简介32.2.2如何应用JMF捕捉媒体数据32.2.3如何在网络上发送流媒体数据42.2.4如何使用RTP接收流媒体数据52.3传输协议53系统设计73.1整体设计73.2系统架构描述73.3主程序流程图84程序设计与实现104.1界面设计104.2服务器端设计114.2.1消息处理114.2.2流媒体数据读取和发送144.3客户端设计165系统运行结果205.1系统配置205.2播放本地文件205.3播放流媒体文件206总结22V 致谢23参考文献24V嘉兴学院本科生毕业论文(设计) 1绪论1.1课题的研究背景1.1.1流媒体技术简介 流媒体(Streaming)技术是指在发送端和接收端之间以一定速率传输音频、视频信息的一种传输技术。流媒体具有隐含的时间维、传输的实时性和等时性、高吞吐量等特点[1]。目前因为因特网上带宽不足、服务质量控制机制比较较弱,不能满足流媒体的实时性要求,为此因特网工程任务组(IETF)制定了一系列支持流媒体实时传输和服务质量控制的协议,如RTP(Real-timetransportProtocol)、RSVP(ResourceReserveProtocal)、RTCP(Real-timeTransportControlProtocal)等。其中,RTP是所有这些协议的基础[2]。在网络上传输音频或视频等多媒体信息,主要有下载回放和流式传输两种方法。下载回放方式占用内存多,所需时间长,往往要求用户等到整个文件全部下载完后才能回放。流式传输中视频与音频等可以通过网络向用户进行连续、实时传送,用户不需再等到整个文件全部下载完,而是只需经过几秒或十几秒的延时后就可以可进行观看[3]。流媒体指使用流式传输的方式在英特网上播放的媒体格式,如视频,音频或多媒体文件。流媒体技术就是把连续的影像和声音信息结果压缩处理后放在网络服务器上,让用户边下载观看和收听,而不需等到整个文件下载完毕后才观看,它是以网络通信,多媒体数据压缩,多媒体数据存储,多媒体数据传送等技术为基础的技术[4]。而流式传输方式是将视频、音频或其他媒体压缩为一个个压缩包后,由视频服务器向用户计算机连续、实时传送,只需要在用户端缓存足够可播放的视频容量后就可以开始播放[5]。1.1.2流媒体技术的迅速发展当今时代,网络宽带得到日益发展,网络服务的内容成为今后网络应用的一个重点发展方向,流媒体技术及相关产品将更广泛的应用于网络电台、远程教育、视频点播、收费播放等。随着宽带成为网络架构的重点,网络上的信息不再是文本,图像或简单的声音文件。流媒体不同于传统的多媒体,传统多媒体文件需要从服务器上下载后才能播放,一个一分钟的视频文件夹,在56K的窄带网络上至少要30分钟才能下载到本地硬盘。而流媒体的特点是运用可变宽带技术,使人们可以在28K到1200K的宽带环境下在线欣赏高品质音频和和视频节目。流媒体在中国的宽带建设中被列为最主要的应用之一,人们普遍看好流媒体的未来发展。1.2课题研究的目的与意义36 随着互联网的普及,利用网络来传播视频与声音的需求日益强烈,电视广播等媒体也都希望通过互联网来传播他们的节目作品,但是下载之后再播放的方式大大限制了人们在网络上大量使用视频与音频信息进行交流。为解决这种矛盾,流媒体技术应运而生。本课题的目的,就是运用流媒体技术,尝试去稍稍解决一些视音频视频等大文件传输困难的问题。同时,通过完成本系统的设计,能让自己对专业知识有一个更深入的了解,在一定程度上提高自己的综合实力。1.3课题的研究内容本课题的主要内容是设计一个简单的无障碍流媒体播放系统。该系统除了能播放本地文件外,还能发送、接收并播放流媒体文件。本系统分为“服务器端”和“客户端”两个部分。服务器端,包括有“消息处理”、“流媒体数据发送”和“流媒体数据读取”几个部分,客户端则包括“流媒体数据接收”与”流媒体数据播放”两个部分。1.4课题的研究方法本课题研究的是如何设计一款较为人性化的以Java作为编程语言,在Eclipse上运行的一款集播放、数据传送、数据接收、服务器选择于一身的流媒体播放系统。本课题的研究方法是,在设计整体架构和客户端、服务器端程序结构时,将整个系统应用模块化,并逐个实现各个模块,并做好相应的单元测试,最终实现所有模块,并完成整体测试,实现这个流媒体播放系统。1.5论文的内容组织论文共由七章组成。第1章绪论,主要介绍系统的研究背景、研究目的和意义、研究内容以及研究方法;第2章基础知识简介,主要介绍系统开发过程中会用到的相关技术,主要有系统开发语言Java,以及Java媒体框架(JMF)和传输协议;第3章系统分析,主要是对系统总体功能的一个阐述,说明系统要实现的各个基本功能模块,并对系统的可行性进行分析;第4章程序设计与实现,主要介绍系统的界面设计、功能实现、主要技术难点;第5章系统运行结果,主要截取了一些运行时的截图;第6章总结,主要阐述了本课题所完成的研究工作和存在的不足,以及希望在今后可以完善的地方。36 2基础知识简介2.1Java简介Java,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。用Java实现的HotJava浏览器(支持Javaapplet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Javaapplet。Java是一种动态语言,它具有简单、面向对象、分布式、解释型、健壮安全、结构中立、可移植、性能优异、多线程等特点[6]。2.2Java媒体框架(JMF)简介Java术语,意为Java媒体框架(JMF)。该核心框架支持不同媒体(如:音频输出和视频输出)间的时钟同步。它是一个标准的扩展框架,允许用户制作纯音频流和视频流。JMF实际上是Java的一个类包。JMF2.1.1技术提供了先进的媒体处理能力,从而扩展了Java平台的功能。这些功能包括:可以在JavaApplet上和应用程序中播放各种媒体文件,如Quicktime、MicrosoftsAVI和MPEG-1等,在互联网上传播视频数据流和音频数据流,用截取设备截取视频或者音频并保存为多媒体文件,在互联网上广播音频和视频数据。此外,JMF2.1.1软件中包括了一个开放的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件。2.2.1JMF体系结构简介在开发JMF应用程序之前要完全理解JMF的体系架构、接口和类。就拿我们的家用摄像机系统作个例子。首先用摄像机拍摄内容,拍摄下来的内容录制在DV带中。DV带可以放在放像机里播放、放像机提供视频信号给电视机,提供音频信号给音箱,这样我们就可以在电视机上看到画面,从音箱里听到声音。JMFAPI提供的也是同样的模型。在文献[7]里,作者对JMF做了详尽的说明,并将JMF提供的模型大致分为7类:数据源(Datasource)、截取设备(CaptureDevice,包括视频和音频截取设备)、播放器(Player)、处理器(Processor)、数据池(DataSink)、数据格式(Format0管理器(Manager).2.2.2如何应用JMF捕捉媒体数据可以应用JMF从摄像头和麦克风中采集数据,采集后的数据可以被处理、保存、渲染为以后应用。捕获媒体数据需要做以下工作:1、定位所需要用的捕获设备,可以通过查询截取设备来定位。36 2、获取这个捕获设备的信息对象。3、从截取设备信息对象中获取捕获设备的位置。4、利用媒体的位置创建数据源。5、使用数据源创建播放器或者处理器。6、然后启动播放器就开始了媒体的捕获。如果只是想观看捕获的内容,只需要使用捕获数据源创建播放器即可。如果想把捕获的数据发送到网络或者保存起来,就需要创建处理器。可以从截取设备管理器中获取捕获设备的信息。截取设备管理器是可在JMF中使用的全部捕获设备的注册中心。可以通过调用截取设备管理器(CaptureDeviceManager)的getDeviceList方法获取可用的捕获设备列表。每个捕获设备都由截取设备信息(CaptureDeviceInfo)对象代表,要获取一个特定的设备只需要调用截取设备管理器(CaptureDeviceManager)的getDevice方法。从特定的设备捕获媒体数据,需要从它的截取设备信息(CaptureDeviceInfo)对象中获取这个设备的位置信息MediaLocator。可以用MediaLocator直接构建一个Player或者Processor。还可以用MediaLocator构建一个DataSource作为Player的输入。当Play开始的播放的时候,就开始捕获过程。一个捕获设备通常有一系列属性可以进行配置。通常控制分为2种,一种是端口控制(Portcontrol),另一种是监视(MonitorControl)。可以通过调用捕获数据源的getControl方法,来获取这两种控制对象。和其他的控制对象一样,对于PortControl或者MonitorControl都可以通过调用getControlCompent方法来得到它们的可视化组件。这些组件可以添加到Applet中或者应用程序中,这样用户可以和这些控制对象交互。处理显示控制组件,还可以显示标准的Player控制组件。2.2.3如何在网络上发送流媒体数据在发送RTP数据流之前,需要应用Processor产生RTP编码的数据源。通过构建一个会话管理器或者是数据池来控制传输过程。Processor处理器的输入可以是现有的媒体文件,也可以是实时捕获的数据。对于现有的媒体数据,可以使用MediaLocaotr来代表媒体文件。并根据MediaLocator来创建Processor。对于捕获的媒体数据,一个捕获数据源CaptureDataSource会用作Processor的输入。有两种方式来发送RTP数据流,一种是用MediaLocator作为RTP36 session的参数,调用Manager的createDataSink方法来创建一个RTPDataSink。另一种方式是利用SessionManager来创建发送数据流,并控制传输过程。当利用MediaLocator来构建RTPDataSink的时候,你只能发送DataSource中的第一个数据流。如果需要在一个进程中发送多个RTP数据流或者需要监控进程的统计状态,就需要直接使用SessionManager。无论采用哪种方式传输RTP数据流,都需要做如下工作:1、使用DataSource创建Processor,这个DataSource代表你要传输的数据。2、设置Processor的输出为RTP编码的数据。3、取得Processor的输出作为DataSource[8]。2.2.4如何使用RTP接收流媒体数据JMFPlayer和Processor可以提供显示、获取、转换RTP数据流的机制。可以按照标准的方式通过Manger为RTP数据流创建播放器。使用包含RTPSession的MediaLocator作为参数,调用Manager的createPlayer(MediaLocator)来创建Player。也可以用某个接收数据流的DataSource作为参数来创建Player。如果用MediaLocator作为参数来创建Player,Player只会显示Session中检测到的第一个RTP数据流。如果想播放Session中的所有视频流,那就需要调用SessionManager为每个接收数据流创建一个Player。当使用MediaLocator为RTPSession创建Player,Manager为Session中的第一个数据流创建Player。当检测到数据时,Player发出RealizeCompleteEvent。通过监听RealizeCompleteEvent,可以确定数据是否到了以及Player是否可以播放任何数据。一旦Player发出这个事件,就可以获取Player的可视组件和控制组件。需要注意的是,如果在没有检测到Session中数据时,Player是不会结束Realizing状态的。对于RTP媒体流Player不能试图调用Manager的CreateRealizedPlayer。如果调用,会引起死锁。2.3传输协议流式传输的实现需要合适的传输协议。TCP需要较多的开销,故不太适合传输实时数据。流式传输的实现方案中,一般采用HTTP/TCP来控制信息,而用RTP/UDP来传输实时媒体数据。RTP:实时传输协议(Real-timetransportProtocol),一种用与Internet上针对多媒体数据的一种传输协议。RTP被定义为在一对一或多对多的传输情况下工作,他提供时间标志,系列号以及其他能够保证在实时数据传输时处理时间的方法,目的是提供时间信息和实现流同步,RTP依靠RVSP保证服务质量标准[9]。36 RTCP:实时传输控制协议(Real-timeTransportControlProtocal),和RTP一起提供流量控制和拥塞控制服务。在RTP会话期间,个参与者周期性地传输RTCP包。RTCP包中含有已发送的数据包的数量、丢失的数据包等数量统计资料,因此,服务器可以利用这些信息动态的改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,他们能以有效的反馈和最小的开销使传输速率最佳化,因此特别适合传送网上的实时数据。实时流协议RTSP(RealTimeStreamingProtocol)定义了一对多应用程序如何有效通过IP网络传输多媒体数据。RTSP是由RealNetworks和Netscape共同提出的,他在体系结构上位于RTP和RTCP之上,它使用TCP或RTP完成数据传输。HTTP与RTSP相比,HTTP传送HTML,而RTP传输多媒体数据。HTTP请求由客户机发出,服务器做出响应;使用RTSP时,客户机和服务器都可以发出请求,即RTSP可以是双向的。资源预定协议RSVP(ResourceReserveProtocal)是Internet上的资源预定协议。使用RSVP预留一部分网络资源(即宽带),能在一定程度上为流媒体的传输提供QoS。在图2-1里,可以清楚的表示这些协议各自的功能。应用控制命令+SDP音频视频数据发送/接收请求RTSPRTP/RTCPTCPUDPIP数据链路层物理层图2-1:网络协议结构图36 3系统设计3.1整体设计在该系统中,有以下期望实现的功能:1、服务器端的消息处理功能:监听,处理和回应客户端请求。2、服务器端的流媒体数据的读取和发送功能。3、客户端人机交互界面。4、客户端流媒体数据接收功能5、客户端流媒体数据缓冲和协同功能6、客户端播放器播放功能。3.2系统架构描述在文献[10]里给出了一个流媒体播放器系统功能结构图,该图清楚明白地展示了功能模块的划分。图3-1:系统功能结构图如图3-1所示,系统主要划分了以下四个功能模块。36 1、消息处理模块:将人机交互界面传送过来的用户控制指令,实时的反馈给所有客户端,并将用户控制指令封装为指令信息,传送给媒体文件读取模块。2、流媒体数据读取模块:通过消息处理模块的用户控制指令,从本机磁盘上选择要发送的媒体文件,获取数据源,构造媒体定位器。3、流媒体数据发送模块:通过会话管理器(SessionManager),为每一种RTP格式设置相应的轨迹格式传输RTP数据。4、流媒体数据接收模块:为每一种新接收到的流媒体数据产生一个播放器,一边接收流媒体数据,一边将流媒体数据播放出来,实现利用RTP协议在网络中实时接收并播放流媒体数据的功能。3.3主程序流程图根据上述的功能划分,可简单的画出服务器端与客户端的主程序流程图。开始发送连接请求建立连接播放已缓存视频等待视频播放完毕关闭播放设备接收视频数据流程序退出传输过程是否中断播放完中断前缓存视频图3-2:客户端主程序流程图36 开始设置参数:检查视频格式,设置端口号获取参数打开并根据所得参数初始化设备视频采集Socket连接传输是否中断N等待视频传输完毕Y关闭Socket关闭设备程序退出视频传输图3-3:服务器端主程序流程图36 4程序设计与实现4.1界面设计系统菜单栏位于整个播放器的上端,用户可通过选择菜单里各选项实现系统的各个部分。界面设计的主要代码为:privateJMenuItemhelpItem=newJMenuItem();privateJMenufileMenu=newJMenu("打开文件");privateJMenunetMenu=newJMenu("网络");privateJMenuserverMenu=newJMenu("服务器");privateJMenufoldermenu=newJMenu("打开文件夹");privateJMenuexitmenu=newJMenu("退出");privateJMenuItemserverItem=newJMenuItem("开启服务器");privateJScrollPanemediaStore=newJScrollPane();privateListmediaListLabel=newLinkedList();//媒体清单//privateJMenuBarmenuBar=newJMenuBar();privateJMenuItemopen=newJMenuItem("打开本地文件");//打开文件privateJMenuItemopenNetwork=newJMenuItem("打开网络功能");//打开网络privateJMenuItemclose=newJMenuItem("关闭");//关闭文件privateJMenuItemexit=newJMenuItem("退出");//退出播放器privateJPanelplayerView=newJPanel();privateBoxshotDisplay=Box.createHorizontalBox();//水平的盒子布局privateJScrollPaneshotPanel=newJScrollPane();privateJScrollPaneshotScroll=newJScrollPane();privateJPanelstorePanel=newJPanel();privateJLabellocationLabel=newJLabel();36 /**显示当前状态的变量-单击状态或者网络状态*/privateJFrameframe=newJFrame();frame.setTitle("流媒体播放器");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setBackground(newjava.awt.Color(200,200,50));shotDisplay.setBackground(newjava.awt.Color(204,255,255));//shotDisplay.setLayout(newjavax.swing.BoxLayout(shotDisplay,//javax.swing.BoxLayout.LINE_AXIS));shotPanel.add(shotDisplay);shotScroll.add(shotPanel);playerView.setBackground(newjava.awt.Color(0,255,204));playerView.setLayout(newjava.awt.BorderLayout());mediaStore.setBackground(newjava.awt.Color(51,153,255));locationLabel.setBackground(newjava.awt.Color(255,204,204));locationLabel.setForeground(newjava.awt.Color(0,204,204));locationLabel.setText("单机状态");locationLabel.setSize(150,25);locationLabel.setBorder(newMatteBorder(null));fileMenu.setText("打开文件");open.setText("打开");menuBar.add(fileMenu);menuBar.add(netMenu);menuBar.add(foldermenu);menuBar.add(exitmenu);menuBar.add(serverMenu);serverMenu.add(serverItem);4.2服务器端设计服务器端的的主要功能有消息处理、流媒体数据读取与流媒体数据发送。4.2.1消息处理JavaSocket可以实现客户端和服务器之间的通信,在服务器端建立一个ServerSocket对象并且绑定端口然后就等待与客户端进行连接,当接收到某个客户端的连接请求后36 ,就为该客户开启一个新的线程来处理通信。这里有必要采用多线程技术,假设同时多个客户端同时发起了连接请求,如果采用单线程的话这多个客户端就需要排队等待,一直等到前一个连接的客户端退出连接,不然其他请求只有继续等待。客户端连接服务器需要知道服务器的IP地址和它所使用的端口号。另外,客户和服务器通信还需要遵循他们特别约定的通信协议。比如,服务器要知道客户端向它请求何种服务,而它又需要做出什么动作来响应客户的请求。而这些协议是没有现成的,这部分工作是客户端和服务器端通信的主要工作。客户端请求连接,服务器给出给出响应。利用Socket建立连接后,服务器端需及时地反馈客户端控制指令,并将此指令封装成指令信息,传送给服务器的流媒体读取模块,实现消息处理的主要代码为:publicStringcommand(Stringmessage){Stringstr="error";Stringcmd[]=message.split(">");if("getmedialist".equals(cmd[0])){//请求媒体数据信息System.out.println(mediaPath);str=Tools.findMedias(mediaPath,true);//获取所用媒体信息,并回馈给客户机if(!"".equals(str)){str="list>"+str;}else{str="error>";}}elseif("requestmediadata".equals(cmd[0])){//请求媒体数据//port发送数据的起始端口号try{if((cmd[1]!=null&&!"".equals(cmd[1]))&&(cmd[2]!=null&&!"".equals(cmd[2]))){//操作目标和目的主机存在者进行下一步操作str="mediawellsend>"+36 InetAddress.getLocalHost().getHostAddress()+":"+port;//通知客户端,媒体数据已准备好,并通知待发送的端口号port+=4;//端口自动加14}}catch(ArrayIndexOutOfBoundsExceptionaiobe){str="error>notarget";//回馈错误}catch(UnknownHostExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}elseif("receivedone".equals(cmd[0])){//已经准备好接收媒体数据try{Filefile;MediaLocatormediaLocator;InetAddressinetAddress;file=newFile(mediaPath+cmd[1]);System.out.println(file.toURI().toURL());mediaLocator=newMediaLocator(file.toURI().toURL());inetAddress=InetAddress.getByName(cmd[2]);try{RTPTransmitrtpTransmit=newRTPTransmit(mediaLocator,inetAddress,Integer.valueOf(cmd[3]));rtpTransmit.start1();str="mediaissending>"+mediaPath;//媒体数据正在发送}catch(Exceptione){str="error>";//媒体数据发送出错}}catch(UnknownHostExceptione){//TODOAuto-generatedcatchblock36 e.printStackTrace();}catch(MalformedURLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}if("".equals(str)){str="error";}returnstr;}4.2.2流媒体数据读取和发送在读取流媒体数据之前,首先需要检验媒体的格式是是否被支持,这里因本人的能力实在有限,只能播放JMF所支持Quicktime、MicrosoftsAVI和MPEG-1格式。服务器端发送流媒体数据时,一个RTP协议会话通过一个IP和一对端口号来标识,一个端口传输媒体数据,另一个传输控制数据。每个不同的媒体类型都采用不同的会话来传输,而且他们都是采用独立传输的方式。采用JMF提供的RTP协议实现来进行媒体数据的网络传输步骤:1、从本机选择待发送的媒体文件,获取数据源,并通过该数据源构造媒体定位器。2、将数据以RTP流的形式发送出去。3、产生一个JMF处理器(Process)为每一种RTP格式设置相应的轨迹。4、从处理器获得输出数据源(输出到网络中的数据源)。5、会话管理器(SessionManager)产生一个发送数据流。6、开始会话传输。7、通过监听ControlerEvent时间来控制会话过程。8、停止会话,删除会话管理器。实现上述功能的主要代码为:FormatcheckVideo(Formatsource,Formatsupported){System.out.println(source.toString());intwidth,height;//视频的宽,高Dimensionsize;//视频尺寸36 Formatjpeg,mpg;//JPEG格式Formath263;//H.263格式size=((VideoFormat)source).getSize();//得到视频图像的尺寸jpeg=newFormat(VideoFormat.JPEG_RTP);mpg=newFormat(VideoFormat.MPEG_RTP);h263=newFormat(VideoFormat.H263_RTP);if(supported.matches(mpg)||supported.matches(jpeg)){width=size.width%8==0?size.width:((int)(size.width/8)*8);height=size.height%8==0?size.height:((int)(size.height/8)*8);}elseif(supported.matches(h263)){//H.263格式仅支持三种特定的图像尺寸if(size.width<=128){width=128;height=96;}elseif(size.width<=176){width=176;height=144;}else{width=352;height=288;}}else{returnsupported;}/**返回经过处理后的视频格式**/return(newVideoFormat(null,newDimension(width,height),Format.NOT_SPECIFIED,null,Format.NOT_SPECIFIED)).intersects(supported);}36 publicStringgetTransmit()throwsInvalidSessionAddressException,IOException,UnsupportedFormatException{//产生RTP会话PushBufferDataSourcepbds;//推型数据源PushBufferStreampbss[];//推型数据流intport=portStart;//初始端口号SessionAddresslocal,destination;//会话地址SendStreamsendStream;//发送流pbds=(PushBufferDataSource)outDataSource;//强制转换pbss=pbds.getStreams();//获得推型数据流rtpManagers=newRTPManager[pbss.length];//为每一个轨迹产生一个RTP管理器for(inti=0;i
此文档下载收益归作者所有
举报原因
联系方式
详细说明
内容无法转码请点击此处