文件接收柜tcp课程源码教程-经典_第1页
文件接收柜tcp课程源码教程-经典_第2页
文件接收柜tcp课程源码教程-经典_第3页
文件接收柜tcp课程源码教程-经典_第4页
文件接收柜tcp课程源码教程-经典_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

第十三章多媒体技术13.1图像处理13.2声音文件的播放13.3用Java实现动画13.4利用JMF来播放视频13.1在Applet中图像的绘制13.1.1图像文件的装载getImage()方法 Applet类中提供了getImage()方法用来将准备好的图像文件装到applet中 ImagegetImage(URLurl)ImagegetImage(URLurl,Stringname)我们必须首先指明图像文件所存贮的位置.Java采用URL(UniversalResourceLocation,统一资源定位器)来定位图像文件的网络位置。绝对URL形式指明了网络资源的全路径名相对URL形式,分别由基准URL(即baseURL)再加上相对于基准URL下的相对URL这两部分组成(2)URL的获取构造方法:URL(Stringspec)URL(URLcontext,Stringspec)Applet类中提供了两个方法来帮助我们方便地获取基准URL对象,它们的调用格式如下:

URLgetDocumentBase()URLgetCodeBase()其中getDocumentBase()方法返回的基准URL对象代表了包含该applet的HTML文件所处的目录,而getCodeBase()方法返回的基准URL对象代表了该applet文件(.class文件)所处的目录。Imageimg=getImage(getDocumentBase(),"images/m1.gif");13.1.2图像文件的显示Graphics类提供了一个drawImage()方法,它能完成将Image对象中的图像显示在屏幕的特定位置上,就象显示文本一样方便。drawImage()方法的调用格式如下:booleandrawImage(Imageimg,intx,inty,ImageObserverobserver)其中img参数就是要显示的Image对象。x和y参数是该图像左上角的坐标值。observer参数则是一个ImageObserver接口(interface),它用来跟踪图像文件装载是否已经完成的情况,通常我们都将该参数置为this,即传递本对象的引用去实现这个接口。booleandrawImage(Imageimg,intx,inty,intwidth,intheight,ImageObserverobserver)width和height,即表示图像显示的宽度和高度booleandrawImage(Image1,x,y,Color1,this);booleandrawImage(Image1,x,y,width,heigh,Color1,this);实例:importjava.awt.Graphics;importjava.awt.Image;publicclassno74extendsjava.applet.Applet{Imageimg;publicvoidinit(){img=getImage(getCodeBase(),"boy.gif");}

publicvoidpaint(Graphicsg){intw=img.getWidth(this);inth=img.getHeight(this);g.drawImage(img,20,10,this);//原图g.drawImage(img,200,10,w/2,h/2,this);//缩小一半g.drawImage(img,20,200,w*2,h/3,this);//宽扁图g.drawImage(img,350,10,w/2,h*2,this);//瘦高图}}13.2声音文件的播放(*.au)13.2.1获得声音文件AudioClipgetAudioClip(URLurl)AudioClipgetAudioClip(URLurl,Stringname)13.2.2声音文件的播放voidplay(URLurl)voidplay(URLurl,Stringname)loop()方法重复播放stop()方法结束放音实例:importjava.applet.AudioClip;publicclassAudiosextendsjava.applet.Applet{AudioClipbgmusic,speak;publicvoidinit(){bgmusic=getAudioClip(getDocumentBase(),"space.au");speak=getAudioClip(getDocumentBase(),"intro.au");}publicvoidstart(){if(bgmusic!=null)bgmusic.loop();if(speak!=null)speak.play();}publicvoidstop(){if(bgmusic!=null)bgmusic.stop();}}//关闭背景音乐在Application中图像的绘制img=Toolkit.getDefaultToolkit().getImage("boy.gif");publicclassdrawImageFrameextendsFrame{Imageimg;publicdrawImageFrame(Stringss){super(ss);img=Toolkit.getDefaultToolkit().getImage("boy.gif");setSize(600,300);setVisible(true);}

publicvoidpaint(Graphicsg){intw=img.getWidth(this);inth=img.getHeight(this);g.drawImage(img,20,10,this);//原图g.drawImage(img,200,10,w/2,h/2,this);//缩小一半g.drawImage(img,280,10,w*2,h/3,this);//宽扁图g.drawImage(img,400,10,w/2,h*2,this);//瘦高图}……..}在JavaAplication中播放声音因为AudioClip类及其getAudioClip()方法都是属于java.applet包的,它在Application中无法调用。解决的方法是使用一些Sun在JDK中发布但未正式注明的特点,即在/sun/audio目录下的sun.audio包也提供了类似的方法。下面是实现的代码:importsun.audio.*;//引入sun.audio包importjava.io.*;InputStreamin=newFileInputStream(filename);//打开一个声音文件作为输入AudioStreamas=newAudioStream(in);//用输入六创建一个AudioStream对象AudioPlayer.player.start(as);//player是AudioPlayer中一个静态成员用于控制播放AudioPlayer.player.stop(as);//当需从网上下载文件进行播放时,用以下代码打开音乐文件的网址:AudioStreamas=newAudioStream(url.openStream());//以下是播放一个持续的声音的代码:importsun.audio.*;//引入sun.audio包importjava.io.*;AudioStreamas=newAudioStream(url.openStream());AudioDatadata=as.getData();创建AudioData源ContinuousAudioDataStreamcas=newContinuousAudioDataStream(data);AudioPlayer.player.start(cas);AudioPlayer.player.stop(cas);publicAudioFrame(Stringss){super(ss);try{InputStreamin=newFileInputStream("space.au");AudioStreamas=newAudioStream(in);AudioPlayer.player.start(as);}catch(Exceptione){}}13.3用线程实现动画使用两个线程,一个是原来的程序,另一个用来处理执行无穷循环的部分.(1)定义Applet类,实现Runnable接口publicclass...extendsAppletimplementsRunnable{(2)init()方法------不改变(3)start()方法中,创建一个动画线程并启动publicvoidstart(){if(runner==null);{runner=newThread(this); //newThreadrunner.start();}}(4)stop()方法,停止线程publicvoidstop(){if(runner!=null){//runner.stop();runner=null;}}(5)run()方法,控制动画循环。每次循环,调用repaint(),重绘刷新.publicvoidrun(){while(Thread.currentThread()==runner){ //帧号或其他标志变量变化 repaint();}(6)paint()方法publicvoidpaint(Graphicsg){//根据帧号或其他标志变量变化绘制}importjava.awt.*;importjava.applet.*;publicclassdonghuawordextendsAppletimplementsRunnable{publicThreadrunner;publicintxpos;publicvoidinit(){xpos=600;setBackground(Color.white);}publicvoidstart(){if(runner==null);{runner=newThread(this); //newThreadrunner.start();}}publicvoidstop(){if(runner!=null){//runner.stop();runner=null;}}publicvoidrun(){while(Thread.currentThread()==runner){ xpos=xpos-10; if(xpos==20) xpos=600; repaint();//no.1statement try{Thread.sleep(200);} //wait catch(InterruptedExceptione){} }}publicvoidpaint(Graphicsg){g.setColor(Color.white);g.fillRect(xpos,10,200,150);g.setColor(Color.red);g.setFont(newFont("TimesRoman",Font.BOLD,48));g.drawString("Hello!",xpos,60);}publicvoidupdate(Graphicsg){paint(g); }}8.3消除动画的闪烁 每帧图象消失后在人的视野里只能保持几十毫秒的时间。在动画实现时,如果从前一帧图象消失到下一帧图象绘制完成这一段时间超过了这几十毫秒,就会让人产生闪烁感。我们可用两种方法来减少闪烁,一种是重载update()方法,一种是使用双缓冲技术。(1)重载update()方法当AWT接到一个重绘请求时,就调用update()方法.在缺省情况下,该方法会清除整个背景,再调用paint().在实际情况中,没有必要将整个背景清除,只需将前一帧与当前帧的不同之处清除.重载update()方法,完全接管动画帧的清除和显示工作。也就是说,将原来的update()方法的清除代码和在paint()方法中的绘图方法都包含在新的update()方法中,从而避免了每次重绘时将整个区域清除。publicvoidpaint(Graphicsg){//清除前一帧与当前帧的不同之处 //绘出本帧;}publicvoidupdate(Graphicsg){paint(g); }(2)双缓冲技术在显示一幅图象时,如果绘图指令过多,则有可能使这帧图象的显示无法在一个显示器刷新周期内完成。这样,也会造成闪烁感。我们可用一个数组来虚拟一个“显示器”,将一帧图象先绘制在这个虚拟的“显示器”上,待整个图象绘制完毕,再一次性显示到屏幕上去。这样,因为绘制图象的操作都是对内存的操作,只需在最后才访问一次显示器,所以图象的显示速度得到很大提高。但是要占用一定的内存.在Java中,这个虚拟的显示器被封装在一个Image对象中.(1)说明Image对象和Graphics对象publicImageoffscreenImg;publicGraphicsoffscreenG;(2)在init()方法中,创建Image对象和Graphics对象offscreenImg=createImage(600,600);offscreenG=offscreenImg.getGraphics();(3)在paint()方法中,调用Graphics对象的绘图方法,把图形绘到Image中.offscreenG.setColor(Color.white);offscreenG.fillRect();(4)将图形一次性绘到显示器上.g.drawImage(offscreenImg,0,0,this);完整的动画程序框架:importjava.awt.*;importjava.applet.*;publicclass...extendsAppletimplementsRunnable{Colornowcolor=Color.black;publicThreadrunner;publicImageoffscreenImg;publicGraphicsoffscreenG;publicvoidinit(){offscreenImg=createImage(600,600);offscreenG=offscreenImg.getGraphics();}publicvoidstart(){if(runner==null);{runner=newThread(this); //newThreadrunner.start();}}publicvoidstop(){if(runner!=null){//runner.stop();runner=null;}}publicvoidrun(){ intspeed=200; //getspeed while(Thread.currentThread()==runner)…//帧号或其他变量变化 repaint(); try{Thread.sleep(speed);} //睡眠 catch(InterruptedExceptione){} }}publicvoidpaint(Graphicsg){offscreenG.setColor(Color.white);offscreenG.fillRect(…);//根据帧号或其他变量绘制图形g.drawImage(offscreenImg,0,0,this);}//绘到显示器上publicvoidupdate(Graphicsg){paint(g); }}实例:importjava.awt.*;importjava.applet.*;publicclassexa5extendsAppletimplementsRunnable{Colornowcolor=Color.black;//nowcolor:颜色变量publicThreadrunner;publicintxpos,tag=0;//xpos:坐标变量tag:增大缩小标记publicImageoffscreenImg;publicGraphicsoffscreenG;publicvoidinit(){setBackground(Color.white);setForeground(Color.white);xpos=50;offscreenImg=createImage(600,600);offscreenG=offscreenImg.getGraphics();}publicvoidstart(){if(runner==null);{runner=newThread(this); runner.start();}}

publicvoidstop(){if(runner!=null){runner.stop();runner=null;}}publicvoidrun(){ intspeed=200; //getspeed while(Thread.currentThread()==runner) {if(nowcolor==Color.black) nowcolor=Color.red; …… //颜色循环变化

if(tag==0) xpos=xpos+10; else xpos=xpos-10; if(xpos==200) tag=1; if(xpos==20) tag=0;//坐标按从小到大,从大到小循环变化 repaint();//no.1statement try{Thread.sleep(speed);} //wait catch(InterruptedExceptione){} } }publicvoidpaint(Graphicsg){offscreenG.setColor(Color.white);offscreenG.fillRect(xpos-20,xpos-20,250,250);offscreenG.setColor(nowcolor);offscreenG.fillOval(xpos,xpos,xpos,xpos);g.drawImage(offscreenImg,0,0,this);}publicvoidupdate(Graphicsg){paint(g); }}图象动画的设计一组图象文件,一帧一帧地快速显示.(1)定义一组Image对象及帧号.(2)在init()方法中,获取若干个Image对象.getImage(getDocumentBase(),文件名);(3)在run()方法中,根据帧号循环绘制图片While(){帧号变化;repaint();延迟;}(4)在paint()方法中,根据帧号绘制一幅图片.在Frame中播放动画publicclassdonghuaFrameextendsFrameimplementsRunnable{publicThreadrunner;publicintxpos,tag=0;publicdonghuaFrame(){setTitle("donghuaFrame");setSize(600,300);setVisible(true);xpos=600;if(runner==null);{runner=newThread(this);//newThreadrunner.start();}。。。}importjava.awt.*;importjava.applet.*;publicclassdonghuaimageextendsAppletimplementsRunnable{Imageframe[];publicThreadrunner;publicintframe_i=0;publicvoidinit(){inti=0;frame=newImage[5];for(i=0;i<frame.length;i++)frame[i]=getImage(getCodeBase(),"images"+i+".gif");}publicvoidstart(){if(runner==null);{runner=newThread(this); //newThreadrunner.start();}}publicvoidstop(){if(runner!=null){runner=null;}}publicvoidrun(){while(Thread.currentThread()==runner){ repaint(); try{Thread.sleep(500);} catch(InterruptedExceptione){} frame_i=(frame_i+1)%frame.length; } }publicvoidpaint(Graphicsg){g.drawImage(frame[frame_i],0,0,this);}}13.4利用JMF来播放视频

13.4.1什么是JMFJava媒体框架(JavaMediaFrame,简称JMF)是一组用来播放、处理和捕捉媒体信息的API,这些API还可以用来传送或接收实况媒体和召开视频会议。,为实现这种功能,JMF运用RTP实时传输协议。JMF的API包括11个软件包,主包为javax.media。JMF目前最新版本是JMF2.1.1c,下载网址是:

在下载JMF时有两种选择,即下载跨平台的JMF或下载专用于 Solaris或Windows的性能包。如果下载的是专用于windows的性能包,则运行jmf-2_1-win.exe来安装Windows版的JMF。JMF提供了一个三层的体系结构:第一层为高级表现形式(播放器),作为一个应用程序,用户可以播放器来收看视频。第二层为过程处理API,软件开发人员通过高级API进行交互的应用程序的开发。第三层为低级插入式API,通过一种可以集成到体系结构的插件,为整个体系结构提供一种可扩展的能力。播放视频播放媒体就相应地需要一个播放器,每个播放器从数据源接收数据,然后立刻以精确的时间顺序提交。一个播放器具有六种状态:Unrealized:当一个播放器已被创建,并对即将要播放的媒体一无所知时的状态。Realizing:调用了播放器的realize方法后,可以判定它的资源的 请求。Realized:当Realizing过程结束后进入该状态,已知道需要那些资源以及将要播放的媒体相关的类型信息。Prefetching:当播放器的prefetch方法被调用后进入该状态,正准备播放媒体数据。Prefetched:当播放器的Prefetching操作完成后,进入该状态,此时已准备启动播放。Started:当start方法调用后进入该状态。建立一个播放器的主要步骤如下:第一步:创建播放器。用javax.media包中的Manager类的createPlayer方法创建一个Player对象。第二步:向播放器注册一个控制器。Player提供一个实现ControllerListener接口的事件处理器,该接口有一个方法controllerUpdate(ControllerEventevent),当媒体事件发生时调用此方法。第三步:播放器进行预提取。调用Player类的prefetch()方法。第四步:启动播放器。调用Player类的start()方法。第五步:停止播放器。调用Player类的stop()方法。importjava.awt.*;importjava.awt.event.*;importjavax.media.*;//引入包

classplayerextendsFrameimplementsControllerListener{ Playerp; Componentvc;player(Stringss,Stringmedia

温馨提示

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

评论

0/150

提交评论