java媒体播放器实验报告.doc_第1页
java媒体播放器实验报告.doc_第2页
java媒体播放器实验报告.doc_第3页
java媒体播放器实验报告.doc_第4页
java媒体播放器实验报告.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象程序设计 题目:媒体播放器 班级:计算机科学与技术二班 组员:徐开泰 杨润明 魏丹丹 王宏鑫 王家俊 /*组长:徐开泰 2013040349 小组成员(1)学号:2013040349 姓名徐开泰(2)学号:2013042107 姓名杨润明(3)学号:2013020040 姓名魏丹丹(4)学号:2013020141 姓名王宏鑫(5)学号 姓名王家俊1 概述随着社会文明的发展,人们不再仅仅满足于物质享受,更加追求精神上的享受。音乐作为艺术的一种形式,成为人们日常生活中的一种娱乐方式,于是媒体播放器很好地实现了音乐的打开、播放、暂停、停止、快进、快退等功能,方便人们选择性地欣赏。通过了解和运用Java编程工具编写制作视频媒体播放器,提高Swing和jmf技术结合的综合运用能力。2.需求分析2.1任务目的:1实现视频文件的正确播放;2. 能够实现对视频播放的控制,如暂停,播放,快进,快退,上一个,下一个等功能;3能够进行文件视频的选择,全屏,音量的控制,拖动,播放模式的控制等;4任意改变播放视频界面大小等功能。要求学生掌握:掌握Java的语言规范,面向对象的核心概念和特性。掌握Java的编程技术,包括异常处理,图形界面设计,多线程,网络通信程序等。掌握Java应用软件的开发环境和开发过程掌握基于Jsp网站的开发环境和开发过程掌握面向对象的思想和程序设计方法。2.2程序的设计、调试、运行的软件环境:操作系统:Windows XP(SP2)数据库及数据库管理软件:SQL Server 2000JDK环境:Java SE Development Kit(JDK)Version 6开发工具:Eclipse3.2运行平台:Windows、Linux各个版本、MAC等任何平台运行环境:Java SE Runtime Environment(JRE)Version3.程序设计过程3.1实验原理JMF提供了一个平台无关的框架来呈现时基媒体(time-based media)。JavaMediaPlayerAPI的设计目标是支持多种标准的媒体格式,包括MPEG-1,MPEG-2,QuickTime,AVI,WAV,AU和MIDI.使用JMF,可以同步呈现不同来源的时基媒体。现有的一些媒体播放器都严重依赖原生码来执行解压缩、渲染 等 计算密集型任务。而JMF API则隐藏了具体实现,只提供抽象的编程接口。举例来说,一个用JMF制作的播放器,具体运行的过程中可能会调用到操作系统的本地方法,但开发者写代码时可以无视本地方法的存在。JMF Player API :接入不同的协议和分发(传输)机制接入不同的媒体数据类型定义事件模型,用于Player和应用程序间的异步通信3.1.1数据源(Data Source)一个DataSource 封装了媒体的地址、协议和分发的软件。一个JavaMediaPlayer包含一个DataSource。一旦创建,这个DataSource不能被用于其他媒体的传输。 一个Player的数据源可以用MediaLocator或URL来标示。MdiaLocator(媒体定位器)是一个JMF类,用来描述Player播放的媒体。MediaLocator与URL类似,并且可以从URL来创建。他们的区别在于,在Java中,URL只有其协议是已知协议时才能被创建,而MediaLocator则没有这个限制。Java 媒体播放器可以播放来自多种数据源的媒体数据,包括本地、网络文件和实时广播等。JMF支持两种不同的数据源。Pull Data-Source (数据源被动的被获取)由客户端发起数据传输并控制数据流,已知的协议包括HTTP(超文本传输协议)和本地文件。Push Data-Source (数据源主动推送)由服务器发起数据传输并控制推送数据流。此类数据源包括广播媒体,多点传送的媒体和VOD(视频点播)。客户端程序所能够控制的度量,取决于媒体源的类型。举个例子说,MPEG文件可以被重定位(reposition),那么播放MPEG的客户端程序就可以允许用户重播或者跳进至一个新时间点;而由服务器段控制的广播媒体则不能被重定位;另外VOD协议则支持有限的用户操作,比如一个VOD客户端程序可以允许用户跳进至新位置,但不能快进和快倒。3.1.2 Players一个Java Media Player是一个对象。她基于时间来处理数据流,从DataSource读取数据并在确切的时间点渲染媒体。一个Java Media Player必须实现Player interface.Clock定义了基本的计时和同步操作, 她被Player 用来控制媒体的呈现。Controller继承Clock对外提供提供如下方法:管理系统资源预载数据提供监听机制(Observable),对外发送媒体事件通知Duration提供了检测媒体时长的途径。Player支持标准的用户控制,并放宽了来自于Clock的一些操作限制。多个Player共享一个公共的计时和同步模型。一个Player的媒体时间表示了媒体流的当前位置。每一个Player有一个TimeBase。TimeBase定义了Player的时间流逝。当一个Player 被执行start,他的媒体时间会被映射到time-base时间。如多个媒体要同步,那么他们必须使用同一个TimeBase.一个Player的用户界面可以包含一个可视组件和一个控制面板组件(control- panel component)。我们用的时候可以选择实现一个自定义的用户界面,或者使用Player的默认的控制面板组件。一般来说,一个Player在能够呈现媒体之前,必须先执行一序列的操作。而这些操作有可能会耗费一定的时间,所以JMF定义了一些操作状态,并且提供了状态转换的操作机制。3.1.3 Media EventsJMF事件报告机制允许我们的程序响应媒体驱动的错误,比如数据丢失或资源不可用。事件系统同时也提供了重要的通知协议;当我们的程序调用一个Player的异步方法时,只有当收到响应的事件消息时,才能确认操作是否完成。有两种JMF对象会抛出事件,他们是: GainControl对象 和 Controller 对象。 对于事件, GainControl和 Controller 遵循Java Beans 形式。GainControl对象只抛出一种类型的事件 GainChangeEvent。我们通过实现 GainChangeListener interface来响应gain(增益?)的变化。Controller则会抛出多种派生自 ControllerEvent的事件。我们通过实现 ControllerListener interface 来接收诸如Player的Controller抛出的事件消息。下图显示了Controller抛出的各种事件类型:ControllerEvents 可分为三类:改变通知、关闭事件和转换事件变化通知(Change notification events)诸如 RateChangeEvent 和 DurationUpdateEvent。他们表示Player的一些属性数值发生了变化。这类事件通常是对一些方法调用的回馈。例如, 一个Player的setRate方法被调用,他会抛出一个 RateChangeEvent.转换事件(TransitionEvents) 让我们的程序能够响应Player的状态变化。 当Player从一个状态转换到另一个状态时,就会抛出一个转换事件。 (在1.4中,我们会提供更多的关于Player状态的信息)当player关闭时,则会抛出关闭事件(ControllerClosedEvents)。当一个Player不再可用时,抛出 ControllerClosedEvent. ControllerErrorEvent(控制器错误事件)则是关闭事件的一个特例。我们写程序时,通过监听控制器错误事件,可以对Player故障作出响应,从而增进用户体验。3.1.4 Player StatesJavaMediaPlayer有6种状态。Clock 接口定义了两种主要的状态:Stopped和Started。在普通操作中,Plyaer在到达Started状态前,会逐个通过上图中的每一个状态。Unrealized(未实现) 状态表示Player已经被实例化,但还不知道媒体的任何信息。当Player第一次被创建,他的状态就是Urealized。Player的realize方法被调用后,会从Unrealized转入Realizing(实现中)状态。这时的Player应该正在检测资源需求。在relization过程中,Player会获取只需加在一次的资源。这些资源包括非独享的渲染资源。(独享资源指的受限的资源。例如只能被一个播放器使用的个别硬件资源,此类资源会在预取(Prefetching)的过程中加载。) Realizing中的Player常常通过网络下载东西。Player结束Realizing状态后,会转入 Realized(已实现)状态。这个状态下,Player会知道他需要哪些资源,还知道媒体的类型信息。因为Realized Player知道怎样渲染数据,所以他能够提供可视组件和控件。此时 ,Player与其他系统对象的连接已经就位,但此时还不会占用任何会阻止其他Player启动的资源。Prefetch被调用后,Player会从Realized状态转入Prefetching(预取中)状态。此时播放器在为呈现媒体作准备,包括调用媒体数据、获取独享资源 和其他一些准备工作。在媒体呈现过程中,一些操作可能会导致 Prefetching状态 重现,例如重新定位播放位置、播放器请求额外的缓冲区等。当Player 结束预取,将转入 Prefetched( 预取完成 ) 状态。此时Player 已经准备开始播放但尚为实际开始。调用start方法将使Player转入Started状态。此时,Player的媒体时间被映射到time-base时间,并且clock开始运行。此时播放器有可能会等待一个恰当的时间来呈现媒体数据。当player从一个状态转入另一个状态时,会抛出 TransitionEvents(转换事件),我们可以通过实现 ControllerListener接口来监听这些时间并作出恰当的响应。 当播放器开始Realizing和Prefetching的时候,我们可以使用事件报告机制对Player进行管理,在调用Player方法之前,我们可以先检查Player状态,在作出恰当的操作。3.1.5 Calling JMF Methods 调用JMF方法时的一些约定JMF对于errors(错误)和exceptions(异常)作如下约定。Java Media Errors 是当程序调用了一个当前状态下非法的方法时抛出的。Errors是在外部程序有控制权的状态下执行了非法的请求而抛出的。举例来说,调用一个处于Started的Player的方法时抛出的就是error。开发者有责任在调用方法前确认Player已被停止。JMF error是可以通过优化代码来避免的,应用程序不应该捕获JMF errors, 好的应用程序不会碰到这些错误。Java Media Exceptions是当程序调用了不能完成的方法或在当前状态下不适用的方法。Exceptions是在外部程序没有控制权的状态下抛出的。例如当我们试图同步两个time-base不匹配的Player时,就会抛出异常。之所以是异常而不是错误,是因为我们无从检测time-base是否匹配,是无法预期的。有时,JMF的一些方法会返回非预期的结果,通过检查返回直,我们可以检测实际发生的事情:我们可以通过返回直检查实际被设置的数值,例如:并不是所有的播放器都可以每周期5次的速率呈现媒体数据,如果我们调了setRate(5.0),播放器将会设置一个合法的近似直,这个数值可能是5.0也可能是1.0,我们需要检查返回数据来确认被设置的数据。进行相关的组件添加,关联,贴图等初始化工作有时,我们请求的信息是不可用的。例如:Player在播完一个媒体之前,可能不知道媒体的时长,这时如果我们调了getDuration(),getDuration会返回 DURATION_UNKNOWN.当媒体被播放完一次,再调getDuration时,则会返回正确的时长。3.2 程序设计图界面级相关组件设置与初始化方法:setComponentProperty()List中右击鼠标事件处理,弹出选择操作菜单:mousePressed();List中双击鼠标事件处理,开始播放选中文件:mouseClicked();单击List中从列表删除事件:menuItem_delete.addMouseListener();List列表框中鼠标事件监听及处理方法:addPlayListListener()中播放暂停事件:menuItem_playSelect.addMouseListener();单击Li单击Listst中向列表中添加事件:menuItem_addFile.addMouseListener();单击List中清除播放列表事件:menuItem_deleteAll.addMouseListener();界面上控制按钮单击事件监听及处理方法:addPlayBottonListener()左键单击播放暂停按钮事件处理:but_Play.addActionListener();左键单击停止按钮事件处理:but_Stop.addActionListener();左键单击上一个按钮事件处理:but_Prior.addActionListener();左键单击下一个按钮事件处理:but_next.addActionListener();左键单击快进按钮事件处理:but_quickForward.addActionListener();左键单击静音按钮事件处理:but_Sound.addActionListener();左键单击文件按钮事件处理:file.addMouseListener();左键单击快退按钮事件处理:but_quickBack.addActionListener();左键单击单曲播放按钮事件处理:single_play.addMouseListener();左键单击随机播放按钮事件处理: random_play.addMouseListener();左键单击循环播放按钮事件处理: loop_play.addMouseListener();左键单击单曲循环按钮事件处理:single_loop.addMouseListener();构造函数调用成员方法开始:对象实例化对菜单条的鼠标事件监听及处理方法:addPlayMenuListener()左键单击停止按钮事件处理:stop.addActionListener();左键单击播放暂停按钮事件处理:playOrpause.addActionListener();左键单击打开按钮事件处理:open.addActionListener();左键单击退出按钮事件处理:exit.addActionListener();左键单击关于按钮事件处理:about.addActionListener();左键单击帮助按钮事件处理:help_.addActionListener();单击播放暂停按钮事件处理:menuItem_play.addActionListener();单击停止按钮事件处理:menuItem_stop.addActionListener();对播放界面上播放视频时右击事件监听及处理方法:addRightClickListener()单击快进按钮事件处理:menuItem_skinForward.addActionListener();单击快退按钮事件处理:menuItem_rewind.addActionListener();单击退出按钮事件处理:menuItem_exit.addActionListener();对播放视频时改变窗体大小事件监听及处理方法:Container.addCompnentLister();对用户拖动进度条事件监听及处理方法:Jslider_progress.addMouseLiatener();startPlayer(String mediaLocation);初始化播放器,准备开始播放视频文件:一个内部类进行视频文件的相关操作:class PlayerEventHandler extends ControllerAdapter ; 核心代码:/*/public ppp(String s) /构造函数super(s);setComponentProperty();addPlayListListener();addPlayButtonListener();addPlayMenuListener();addRightClickListener();addFrameChangeListener(); /构造函数结束/*/public void addPlayListListener() /对list列表中鼠标事件进行监听并处理 list.addMouseListener(new MouseAdapter() /list列表监听事件public void mousePressed(MouseEvent e) /super.mousePressed(e);System.out.println(e.getModifiers();/通过这个函数返回值区分是单击还是双击int mods = e.getModifiers();if (mods=4) /4时为右击popupMenuList.add(menuItem_playSelect);popupMenuList.add(menuItem_delete);popupMenuList.add(menuItem_Addfile);popupMenuList.add(menuItem_deleteAll);popupMenuList.show(list, e.getX(), e.getY();public void mouseClicked(MouseEvent e)if(e.getClickCount()=2) /在列表框中双击事件for(int i=0;imodel.getSize();i+)/在文件目录中寻找到选中的文件名if(fileDirection.get(i).toString().endsWith(list.getSelectedValue().toString()try startPlayer(fileDirection.get(i).toURL().toString(); /开始播放选中文件but_play.setIcon(new ImageIcon(pause.png);play_temp = true;IsPlaying = true;break; catch (MalformedURLException E) E.printStackTrace(););menuItem_delete.addMouseListener(new MouseAdapter() /单击list中“从列表中删除”事件public void mousePressed(MouseEvent e) model.removeElement(list.getSelectedValue();fileName.removeElement(list.getSelectedValue();fileDirection.removeElement(list.getSelectedValue(););menuItem_playSelect.addMouseListener(new MouseAdapter() /单击list中“播放选中文件”事件public void mousePressed(MouseEvent e) try for(int i=0;imodel.getSize();i+)/在文件目录中寻找到选中的文件名if(fileDirection.get(i).toString().endsWith(list.getSelectedValue().toString()startPlayer(fileDirection.get(i).toURL().toString();System.out.println(fileDirection.get(i).toURL().toString();but_play.setIcon(new ImageIcon(pause_.png);play_temp = true;IsPlaying = true; catch(MalformedURLException e1) e1.printStackTrace(););menuItem_Addfile.addMouseListener(new MouseAdapter() /单击list中“向列表中添加”事件public void mousePressed(MouseEvent e) JFileChooser fileChooser = new JFileChooser(); /实例化文件选择器fileChooser.setMultiSelectionEnabled(true); /可以同时选中多个文件fileChooser.setFileFilter(new MyFileFilter(); /设置文件选择时选择的文件的默认类型fileChooser.showOpenDialog(ppp.this);/显示对话框 File mediaFiles= fileChooser.getSelectedFiles(); /得到选择的文件for(int i=0;imediaFiles.length;i+)fileDirection.add(mediaFilesi);fileName.add(mediaFilesi.getName();model.addElement(mediaFilesi.getName();String path=file:/+mediaFilesi.getPath(); /必须加file:/才能播放选中的文件System.out.println(path);startPlayer(path);but_play.setIcon(new ImageIcon(pause.png);play_temp = true;IsPlaying = true;);menuItem_deleteAll.addMouseListener(new MouseAdapter() /单击list中“清除播放列表”事件public void mousePressed(MouseEvent e) model.removeAllElements();fileName.removeAllElements();fileDirection.removeAllElements(););/*/public void addPlayMenuListener() /对菜单条的鼠标事件进行处理file.addMouseListener(new MouseAdapter()public void mousePressed(MouseEvent e) /file.remove(open);/file.remove(exit);/file.add(open);/file.add(exit););single_play.addActionListener(new ActionListener() /打开退出按钮事件处理public void actionPerformed(ActionEvent event) isSingle_play=true;isSingle_loop=false;isLoop_play=false;isRandom_play=false;);single_loop.addActionListener(new ActionListener() /打开退出按钮事件处理public void actionPerformed(ActionEvent event) isSingle_play=false;isSingle_loop=true;isLoop_play=false;isRandom_play=false;);loop_play.addActionListener(new ActionListener() /打开退出按钮事件处理public void actionPerformed(ActionEvent event) isSingle_play=false;isSingle_loop=false;isLoop_play=true;isRandom_play=false;);random_play.addActionListener(new ActionListener() /打开退出按钮事件处理public void actionPerformed(ActionEvent event) isSingle_play=false;isSingle_loop=false;isLoop_play=false;isRandom_play=true;);random_play.setSelected(true);/默认为随机播放playOrpause.addActionListener(new ActionListener() /播放暂停按钮事件处理public void actionPerformed(ActionEvent event) if(player=null)System.out.println(你没有开始播放任何文件);return;if (play_temp) player.start();but_play.setIcon(new ImageIcon(pause_.png);play_temp = false; else player.stop();but_play.setIcon(new ImageIcon(play_.png);play_temp = true;);stop.addActionListener(new ActionListener() /单击停止按钮事件处理public void actionPerformed(ActionEvent event) if(player=null)System.out.println(你没有开始播放任何文件);return;if(timeThread!=null)timeThread.stop();/不做这一步jslider_progress还会变化player.stop();player.close();panel_up.remove(visualMedia);/不做这一步看不到gif图画jslider_progress.setValue(0););open.addActionListener(new ActionListener() /打开文件按钮事件处理/SuppressWarnings(deprecation)public void actionPerformed(ActionEvent event) JFileChooser fileChooser = new JFileChooser(); /实例化文件选择器fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);/设置文件打开模式为仅打开文件 int result = fileChooser.showOpenDialog(ppp.this);/显示对话框 if (result = JFileChooser.APPROVE_OPTION) /得到用户行为mediaFile = fileChooser.getSelectedFile(); /得到选择的文件fileDirection.add(fileChooser.getSelectedFile();fileName.add(fileChooser.getSelectedFile().getName();model.addElement(fileChooser.getSelectedFile().getName();list.setSelectedValue(fileChooser.getSelectedFile().getName(), true);if (mediaFile != null) try startPlayer(mediaFile.toURL().toString();/转换成URL后再转换成字符串才行 catch (MalformedURLException e) e.printStackTrace(); /开始播放打开的文件);exit.addActionListener(new ActionListener() /打开退出按钮事件处理public void actionPerformed(ActionEvent event) System.exit(0););about.addActionListener(new ActionListener() /打开关于按钮事件处理public void actionPerformed(ActionEvent event) JFrame f = new JFrame(Message); f.setBounds(520, 400, 400, 100); /设置jframe显示的位置,长宽Container container=f.getContentPane();f.setLayout(null);JTextArea jTextArea = new JTextArea(Java视频播放器原始版);String string=n+组员:程飞(20065265),代金龙(20065231);jTextArea.append(string);jTextArea.setBounds(0, 0, 400, 70);jTextArea.setEditable(false); /设置文本为只读的container.add(jTextArea);f.setVisible(true););help_.addActionListener(new ActionListener() /打开关于按钮事件处理public void actionPerformed(ActionEvent event) JFrame f = new JFrame(Message); f.setBounds(520, 400, 400, 150); /设置jframe显示的位置,长宽Container container=f.getContentPane();f.setLayout(null);JTextArea jTextArea = new JTextArea(使用说明n);String string=各个按钮的具体功能:+n+1.双击屏幕全屏,再次双击回到原来大小+n+2.双击播放列表文件可直接播放+n+3.右击播放列表可添加或删除列表;jTextArea.append(string);jTextArea.setBounds(0, 0, 400, 150);jTextArea.setEditable(false); /设置文本为只读的container.add(jTextArea);f.setVisible(true););/*/public void addFrameChangeListener() /对改变窗体大小事件进行处理container.addComponentListener(new ComponentAdapter()/处理窗体大小改变时其它组建跟随改变public void componentResized(ComponentEvent e)int WIDTH= getWidth();int HEIGHT=getHeight();panel_up.setBounds(0,0,WIDTH-140, HEIGHT-125);panel_playList.setBounds(WIDTH-140,0,140, HEIGHT-125);panel_down.setBounds(0,HEIGHT-125,WIDTH, 125);jslider_progress.setSize(WIDTH, 20););/*/public void startPlayer(String mediaLocation) timeThread=new ControlProgrecess();/一个线程管理进度条.(写在这里可以使得以任意一种方法播放视频时都可以与进度条相关联)timeThread.start();if (player != null)/如果播放器非空则移去先前的播放器组件f (visualMedia != null)panel_up.remove(visualMedia); /如果对象visualMedia非空则移去if (mediaControl != null) panel_down.remove(mediaControl); /如果对象mediaControl非空则移去player.close(); /关闭播放器MediaLocator mediaLocator = new MediaLocator(mediaLocation); /媒体定位器System.out.println(打开文件错误); /显示错误信息return;try player = Manager.createPlayer(mediaLocator); /得到播放器实例player.addControllerListener(new PlayerEventHandler(); /增加播放控制器player.realize(); catch (Exception ex) ex.printStackTrace();System.out.println(打开错误); /显示错误信息/*/处理声音的开/关及进度条的拖动事件public void stateChanged(ChangeEvent e) if(e.getSource()=jslider_sound)player.getGainControl().setLevel(float)jslider_sound.getValue()/100);if(e.getSource()=jslider_progress)if (player != null) controlSliderTime();/*/private class PlayerEventHandler extends ControllerAdapter /一个内部类来进行视频文件的相关操作public void realizeComplete(RealizeCompleteEvent realizeDoneEvent) player.prefetch(); /预取媒体数据/完成预取媒体数据后,开始播放媒体public void prefetchComplete(PrefetchCompleteEvent prefetchDoneEvent) getMediaComponents();validate();player.start(); /开始播放媒体/这儿才能得到准确的文件播放时间newTime=(float)player.getMediaTime().getSeconds();fileTime=(float)player.getDuration().getSeconds();/如果媒体播放完毕,重新设置媒体时间并停止媒体播放器public void endOfMedia(EndOfMediaEvent mediaEndEvent) /*player.setMediaTime(new Time(0); /重新设置媒体时间player.stop(); / 停止媒体播放but_play.setIcon(new ImageIcon(play_.png);play_temp = true;*/if(isSingle_play=true)/如果单曲播放按钮被选中player.stop(); if(isSingle_loop=true)/如果单曲循环按钮被选中boolean isThisOne;for(int i=0;imodel.getSize();i+)/因为只有fileDirection中保存了文件路径和文件名字,所以遍历它isThisOne=fileDirection.get(i).toString().endsWith(list.getSelectedValue().toString();if(isThisOne=true)try startPlayer(fileDirection.get(i).toURL().toString();list.setSelectedIndex(i);return; catch (MalformedURLException e) e.printStackTrace();if(isLoop_play=true)/如果循环按钮被选中boolean isThisOne;for(int i=0;imodel.getSize();i+)/因为只有fileDirection中保存了文件路径和文件名字,所以遍历它isThisOne=fileDirection.get(i).toString().endsWith(list.getSelectedValue().toString();if(isThisOne=true)try startPlayer(fileDirection.get(i+1).toURL().toString();list.setSelectedIndex(i+1);return; catch (MalformedURLException e) e.printS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论