首页 mp3播放器

mp3播放器

举报
开通vip

mp3播放器摘要 随着多媒体技术的发展和人们对音频,视频数据的需求,越来越多的软件加入了多媒体功能。 JMF(JavaMediaFrameworkAPI)是一种采用Java语言开发流式媒体应用应用程序接口。它作为JavaMediaAPI技术家族的一个重要组成部分,对Java平台进行了扩展,为媒体应用开发人员提供了增强的媒体开发能力。Java多媒体框架中包含了许多用于处理多媒体的API,所支持的功能包括:可以在JavaApplet和应用程序中播放各种媒体文件,例如AU、AVI、MIDI、MPEG、QuickT...

mp3播放器
摘要 随着多媒体技术的发展和人们对音频,视频数据的需求,越来越多的软件加入了多媒体功能。 JMF(JavaMediaFrameworkAPI)是一种采用Java语言开发流式媒体应用应用程序接口。它作为JavaMediaAPI技术家族的一个重要组成部分,对Java平台进行了扩展,为媒体应用开发人员提供了增强的媒体开发能力。Java多媒体框架中包含了许多用于处理多媒体的API,所支持的功能包括:可以在JavaApplet和应用程序中播放各种媒体文件,例如AU、AVI、MIDI、MPEG、QuickTime和WAV等文件;可以播放从互联网上下载的媒体流;可以利用麦克风和摄像机一类的设备截取音频和视频,并保存成多媒体文件;处理多媒体文件,转换文件格式;向互联网上传音频和视频数据流;在互联网上广播音频和视频数据等。 本系统旨在使用JMF编写一个音频播放器,实现一般播放器的功能,并加入一些当前的播放器不支持的功能。  关键词:Java2 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 版;Java多媒体框架;MP3播放器  DesignAndImplementationOfMp3PlayerBased-onJ2SE Abstract Withthedevelopmentofmultimediatechnologyandtheurgentrequirementofpeopletomultimediadata,moreandmoreapplicationsintegratemultimediafunctionality. JMFisanapplicationprograminterfacewhichadoptsJavalanguagetodevelopstreammediaapplication.AsanimportantpartofJavaMediaAPIfamily,itgreatlyextendsJavalanguageandprovidesenhancedmediaprocessabilityformediaapplicationdevelopers.JMFcontainsmanyAPIsusedtoprocessmultimedia,itsupports:playsdifferentkindsofmediafilesinJavaAppletsandJavaapplications,includingAU,AVI,MIDI,MPEG,QuickTime,WAVandsoon;playsmediastreamdownloadedfromtheInternet;usesdevicessuchasmicrophoneandvideocameratocaptureaudioorvideo,andsavesthemasmultimediafiles;processesmediafiles,convertsformatamongdifferenttypes;uploadsaudioorvideodatastreamtoInternet;broadcastsaudioorvideodatastream. Thissystemissupposedtowriteaprogrambased-onJMFtoplayaudiofile,itimplementsfunctionalitiesjustastheothertypicalmp3playerhasdone,anditalsohassomefeaturesthatunsupportedbythoseplayers.  KeyWords:J2SE;JMF;MP3Player 目  录1引言 11.1项目背景 11.2技术现状与发展趋势 11.3 论文 政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载 组织结构 22技术背景 32.1JMF结构 32.1.1 定义JMF 32.1.2 JMF高层结构 32.1.3 时间模型 42.1.4 管理器 42.1.5 事件模型 52.1.6 数据模型 52.1.7 控制 62.2 重要实例:Player对象 63系统分析与设计 163.1 系统概述 163.2 详细说明 173.2.1 Mp3Player类 173.2.2 AudioMedia类 183.2.3 AdvancedList类 193.2.4 ResourceManager类 203.2.5 TypeFilter类 214 系统的实现 224.1 监听鼠标事件 224.2 最近播放列表和简单收藏夹列表的动态刷新 244.3 支持文件批量操作 264.4 监听Player的状态改变 274.5 文件过滤器实现 304.6 基于对象序列化的信息的存储和恢复 314.7 导出功能 345 结论 36致  谢 37实例二:MP3音乐播放器为了支持MP3的播放,我们必须添加MP3的SPI支持库。首先需要下载MP3的支持库。官方网站:http://www.javazoom.net/。下载页面:http://www.javazoom.net/mp3spi/sources.html。下载地址:http://www.javazoom.net/mp3spi/sources/mp3spi1.9.4.zip。下载文件:mp3spi1.9.4.zip。将mp3spi1.9.4.zip中的3个JAR文件jl1.0.jar、mp3spi1.9.4.jar、tritonus_share.jar添加到当前项目中即可。下面我们来实现一个MP3音乐播放器,实现的功能是:选择"文件"→"打开"命令弹出文件选择对话框,将选择目录的所有MP3和WAV文件加入到播放列表中,双击播放列表中的音乐文件实现音乐的播放和切换。要实现该程序,首先需要提供了一个主程序窗口,该窗口提供了各种界面组件和操作事件的控制,并包含一个音乐播放的子线程,子线程由主线程控制。因此有以下两个类。音乐播放器主程序MusicPlayer.java。播放线程PlayThread.java。(1)音乐播放器主程序MusicPlayer.java该类继承自Frame类,首先需要为该类添加文件播放的5个变量: Stringfilepath;     //播放文件目录Stringfilename;     //播放文件名称AudioInputStreamaudioInputStream;  //文件流AudioFormataudioFormat;   //文件格式SourceDataLinesourceDataLine;  //输出设备并添加一个录音标志开关,控制录音的开始与停止: booleanisStop=true;    //控制播放线程booleanhasStop=true;    //播放线程状态同时添加几个显示界面组件:在该程序的构造函数中,需要分别创建主窗体、菜单栏、文件列表组件、信息显示面板。并为菜单栏注册单击事件,为文件列表组件注册鼠标事件,为窗体注册关闭事件。在菜单栏中选择"打开"选项时,执行打开函数open(),用以打开文件选择对话框,将选择目录的MP3和WAV文件添加到列表组件中。文件列表组件在被鼠标双击时,取得被选择的文件名,并取得被选择的文件名,然后调用播放函数play()进行播放。窗口关闭事件发生时调用System.exit(0)退出程序。play()函数中在播放录音时,调用的是内部播放线程PlayThread.java来进行播放。该函数中首先会设置音乐的停止标志isStop=true,子线程在发现该变量为true时就会停止当前音乐的播放;由于从接收到停止指令到停止音乐的播放会需要一段时间,所以需要在play()中根据hasStop来执行一段时间的暂停,当子线程结束后该变量就会为true,此时play()函数就会继续执行,读取音乐文件,并进行MP3文件的编码,创建新的子线程对象进行播放。该主程序完整的代码如程序17-9所示。程序17-9 音乐播放器主程序MusicPlayer.java packagecom.test.audio;importjava.io.File;importjava.awt.BorderLayout;importjava.awt.FileDialog;importjava.awt.Frame;importjava.awt.GridLayout;importjava.awt.Label;importjava.awt.List;importjava.awt.Menu;importjava.awt.MenuBar;importjava.awt.MenuItem;importjava.awt.MenuShortcut;importjava.awt.Panel;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.KeyEvent;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjavax.sound.sampled.AudioFormat;importjavax.sound.sampled.AudioInputStream;importjavax.sound.sampled.AudioSystem;importjavax.sound.sampled.DataLine;importjavax.sound.sampled.SourceDataLine;publicclassMusicPlayerextendsFrame{booleanisStop=true;   //控制播放线程booleanhasStop=true;   //播放线程状态   Stringfilepath;    //播放文件目录Stringfilename;    //播放文件名称AudioInputStreamaudioInputStream; //文件流AudioFormataudioFormat;  //文件格式SourceDataLinesourceDataLine;  //输出设备   Listlist;//文件列表Labellabelfilepath;   //播放目录显示标签Labellabelfilename;  //播放文件显示标签   publicMusicPlayer(){//设置窗体属性setLayout(newBorderLayout());setTitle("MP3音乐播放器");setSize(350,370);       //建立菜单栏MenuBarmenubar=newMenuBar();Menumenufile=newMenu("文件");MenuItemmenuopen=newMenuItem("打开",newMenuShortcut(KeyEvent.VK_O));menufile.add(menuopen);menufile.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){open();}});menubar.add(menufile);setMenuBar(menubar);       //文件列表list=newList(10);list.addMouseListener(newMouseAdapter(){publicvoidmouseClicked(MouseEvente){//双击时处理if(e.getClickCount()==2){//播放选中的文件filename=list.getSelectedItem();play();}}});add(list,"Center");       //信息显示Panelpanel=newPanel(newGridLayout(2,1));labelfilepath=newLabel("播放目录:");labelfilename=newLabel("播放文件:");panel.add(labelfilepath);panel.add(labelfilename);add(panel,"North");       //注册窗体关闭事件addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setVisible(true);}   //打开privatevoidopen(){FileDialogdialog=newFileDialog(this,"Open",0);dialog.setVisible(true);filepath=dialog.getDirectory();if(filepath!=null){labelfilepath.setText("播放目录:"+filepath);           //显示文件列表list.removeAll();Filefiledir=newFile(filepath);File[]filelist=filedir.listFiles();for(Filefile:filelist){Stringfilename=file.getName().toLowerCase();if(filename.endsWith(".mp3")||filename.endsWith(".wav")){list.add(filename);}}}}   //播放privatevoidplay(){try{isStop=true;//停止播放线程//等待播放线程停止System.out.print("开始播放:"+filename);while(!hasStop){System.out.print(".");try{Thread.sleep(10);}catch(Exceptione){}}System.out.println("");Filefile=newFile(filepath+filename);labelfilename.setText("播放文件:"+filename);           //取得文件输入流audioInputStream=AudioSystem.getAudioInputStream(file);audioFormat=audioInputStream.getFormat();//转换MP3文件编码if(audioFormat.getEncoding()!=AudioFormat.Encoding.PCM_SIGNED){audioFormat=newAudioFormat(AudioFormat.Encoding.PCM_SIGNED,audioFormat.getSampleRate(),16,audioFormat.getChannels(),audioFormat.getChannels()*2,audioFormat.getSampleRate(),false);audioInputStream=AudioSystem.getAudioInputStream(audioFormat,audioInputStream);}           //打开输出设备DataLine.InfodataLineInfo=newDataLine.Info(SourceDataLine.class,audioFormat,AudioSystem.NOT_SPECIFIED);sourceDataLine=(SourceDataLine)AudioSystem.getLine(dataLineInfo);sourceDataLine.open(audioFormat);sourceDataLine.start();           //创建独立线程进行播放isStop=false;ThreadplayThread=newThread(newPlayThread());playThread.start();}catch(Exceptione){e.printStackTrace();}}   publicstaticvoidmain(Stringargs[]){newMusicPlayer();}}在该主程序中添加一个入口主函数main()来启动该主程序即可。(2)播放线程PlayThread.java在主程序的播放函数play()中,调用了播放线程进行播放。该线程与录音机中的播放线程相似,不同的是它需要根据isStop指令来检查是否应该终止当前的播放线程。另外,该线程在播放结束后,还应该设置hasStop=true,告诉play()函数该线程已经停止了,可以继续下一首音乐的播放了。该程序的代码如程序17-10所示。程序17-10 播放线程PlayThread.java classPlayThreadextendsThread{bytetempBuffer[]=newbyte[320];   publicvoidrun(){try{intcnt;hasStop=false;//读取数据到缓存数据while((cnt=audioInputStream.read(tempBuffer,0,tempBuffer.length))!=-1){if(isStop)break;if(cnt>0){//写入缓存数据sourceDataLine.write(tempBuffer,0,cnt);}}//Block等待临时数据被输出为空sourceDataLine.drain();sourceDataLine.close();hasStop=true;}catch(Exceptione){e.printStackTrace();System.exit(0);}}}(3)运行MP3音乐播放器完成以上代码后,即可运行主程序MusicPlayer,就会显示如图17-9所示的窗口。选择"文件"→"打开"命令,就会弹出如图17-10所示的对话框。选中某一个音乐文件后,单击"打开"按钮,就会将该目录下的所有MP3和WAV音乐文件添加到播放器的播放列表中,如图17-11所示。双击该播放列表中的音乐文件,就会开始播放音乐了。在音乐播放的过程中,你还可以随时双击某一个文件来停止当前的音乐播放,并开始播放新的音乐文件。   图17-9 音乐播放器主窗口   图17-10 选择文件    图17-10 选择文件以上的文件打开对话框实际上有一个缺陷,就是我们是通过选择某一个文件来取得要播放的目录的。这是因为AWT的文件对话框类没有提供选择目录的功能。要使用该功能需要使用Swing的JChooser类,这正是Swing扩展AWT的表现。17.4.1JMF模型17.4 视频拍照与播放--JMF多媒体库要进行视频的捕捉与播放,需要使用JMF。JMF实际上是Java的一个类包,它提供了先进的媒体处理能力,扩展了Java平台的功能。这些功能包括:媒体捕获、压缩、流转、回放,以及对各种主要媒体形式和编码的支持,如M-JPEG、H.263、MP3、RTP/RTSP(实时传送协议和实时流转协议)、MacromediasFlash、IBM的HotMedia和Beatniks的RichMediaFormat(RMF)等。JMF还支持广受欢迎的媒体类型,如Quicktime、MicrosoftsAVI和MPEG-1等。此外,JMF中包括了一个开放的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件。JMF的推出已经有几年的历史了,目前最新的版本为2.1.1e,在使用它开发之前需要下载JMF的安装程序。官方网站:http://java.sun.com/javase/technologies/desktop/media/jmf/index.jsp。下载页面:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/download.html。下载地址:http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/jmf-2_1_1e-windows-i586.exe?BundledLineItemUUID=McRIBe.mExYAAAEd6.IHtp.m&OrderID=X7RIBe.m1HIAAAEd1eIHtp.m&ProductID=X4zACUFBcakAAAEYzNI5AXis&FileName=/jmf-2_1_1e-windows-i586.exe。下载文件:jmf-2_1_1e-windows-i586.exe。安装该文件后,会在C:\ProgramFiles\JMF2.1.1e\lib目录下生成几个JAR文件,包括customizer.jar、jmf.jar、mediaplayer.jar、multiplayer.jar、sound.jar,这些都是进行JMF开发所必须的包。首先我们将这些包添加到当前项目的classpath环境中。接下来我们将首先讲解JMF的模型、Player创建 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 、截取多媒体数据的过程。最后通过以下两个实例程序演练JMF。视频拍照程序。视频播放器。17.4.1 JMF模型在开发JMF应用程序之前要完全理解JMF的体系架构、接口和类。JMF提供的模型可大致分为6类。(1)数据源(DataSource)在JMF中,DataSource对象就是数据源,它可以是一个多媒体文件,也可以是从互联网上下载的数据流。对于DataSource对象,一旦你确定了它的位置和类型,在对象中就包含了多媒体的位置信息和能够播放该多媒体的软件信息。当创建了DataSource对象后,可以将它送入Player对象中,而Player对象不需要关心DataSource中的多媒体是如何获得的,以及格式是什么。在某些情况下,你需要将多个数据源合并成一个数据源。例如当你在制作一段录像时,你需要将音频数据源和视频数据源合并在一起。(2)截取设备(CaptureDevice,包括视频和音频截取设备)截取设备指的是可以截取到音频或视频数据的硬件,如麦克风、摄像机等。截取到的数据可以被送入Player对象中进行处理。(3)播放器(Player)在JMF中对应播放器的接口是Player。Player对象将音频/视频数据流作为输入,然后将数据流输出到音箱或屏幕上,就像CD播放机读取CD唱片中的歌曲,然后将信号送到音箱上一样。Player对象有多种状态,JMF中定义了JMF的6种状态,在正常情况下Player对象需要经历每个状态,然后才能播放多媒体。Unrealized:在这种状态下,Player对象已经被实例化,但是并不知道它需要播放的多媒体的任何信息。Realizing:当调用realize()方法时,Player对象的状态从Unrealized转变为Realizing。在这种状态下,Player对象正在确定它需要占用哪些资源。Realized:在这种状态下Player对象已经确定了它需要哪些资源,并且也知道需要播放的多媒体的类型。Prefetching:当调用prefectch()方法时,Player对象的状态从Realized变为Prefetching。在该状态下的Player对象正在为播放多媒体做一些准备工作,其中包括加载多媒体数据、获得需要独占的资源等,这个过程被称为预取(Prefetch)。Prefetched:当Player对象完成了预取操作后就到达了该状态。Started:当调用start()方法后,Player对象就进入了该状态并播放多媒体。(4)处理器(Processor)处理器对应的接口是Processor,它是一种播放器。在JMFAPI中,Processor接口继承了Player接口。Processor对象除了支持Player对象支持的所有功能,还可以控制对于输入的多媒体数据流进行某种处理,以及通过数据源向其他的Player对象或Processor对象输出数据。除了在播放器中提到了6种状态外,Processor对象还包括两种新的状态,这两种状态是在Unrealized状态之后,但是在Realizing状态之前。Configuring:当调用configure()方法后,Processor对象进入该状态。在该状态下,Processor对象连接到数据源并获取输入数据的格式信息。Configured:当完成数据源连接,获得输入数据格式的信息后,Processor对象就处于Configured状态。(5)数据格式(Format)Format对象中保存了多媒体的格式信息。该对象中本身没有记录多媒体编码的相关信息,但是它保存了编码的名称。Format的子类包括AudioFormat和VideoFormat类,ViedeoFomat又有6个子类:H261Format、H263Format、IndexedColorFormat、JPEGFormat、RGBFormat和YUVFormat类。(6)管理器(Manager)JMF提供了下面4种管理器。Manager:Manager相当于两个类之间的接口。例如当你需要播放一个DataSource对象,你可以通过使用Manager对象创建一个Player对象来播放它。使用Manager对象可以创建Player、Processor、DataSource和DataSink对象。PackageManager:该管理器中保存了JMF类注册信息。CaptureDeviceManager:该管理器中保存了截取设备的注册信息。PlugInManager:该管理器中保存了JMF插件的注册信息。17.4.2创建Player对象17.4.2 创建Player对象在JMF编程中,最常见的工作就是创建一个Player对象。你可以通过Manager类的静态方法createPlayer()来创建Player对象。Manager对象使用多媒体的URL或MediaLocator对象来创建Player对象。例如下面的两个实例所示: player=Manager.createRealizedPlayer(mediaLocator);player=Manager.createPlayer(url);当你获得了一个Player对象后,你可以通过调用getVisualComponent()方法得到Player对象的图像部件(VisualComponent,在图像部件上可以播放多媒体的图像)。然后将图像部件加入到应用程序或Applet的界面上。Player对象还包含一个控制面板,在上面可以控制媒体的播放、停止和暂停等。Player类中的很多方法只有在Player对象处于Realized的状态下才会被调用。为了保证Player对象已经到达了该状态,你需要使用Manager的createRealizePlayer()方法来获得Player对象。但是对于start()方法来说,你可以在Player对象到达Prefetched状态之前调用它,它可以自动将Player的状态转换到Started状态。17.4.3截取多媒体数据17.4.3 截取多媒体数据多媒体数据的截取是JMF程序中另一个非常重要的功能。你可以按照下面的步骤截取数据。通过查询CaptureDeviceManager获得你希望使用的截取设备,例如: CaptureDeviceManager.getDevice("vfw:MicrosoftWDMImageCapture(Win32):0");获得设备对应的CaptureDeviceInfo对象。从CaptureDeviceInfo对象中获得MediaLocator对象,例如: mediaLocator=newMediaLocator("vfw://0");使用MediaLocator对象创建Player对象或Processor对象,例如: player=Manager.createRealizedPlayer(mediaLocator);调用start()方法,开始截取多媒体数据: player.start();你可以使用CaptureDeviceManager对象获得系统中可用的视频和音频截取设备。通过调用getDeviceList()方法你可以获得设备的列表。每个设备都对应一个CaptureDeviceInfo对象。也可以通过调用CaptureDeviceManager对象的getDevice()方法来获得特定的CaptureDeviceInfo对象。在使用设备截取多媒体数据前,还需要从CaptureDeviceInfo对象中获得设备对应的MediaLocator对象。然后你可以直接使用MediaLocator来构造Player或Processor的实例,也可以用MediaLocator构造一个DataSource对象,然后将DataSource对象送入Player或Processor对象中。最后调用start()方法来截取多媒体数据。17.4.4实例一:视频拍照程序(1)17.4.4 实例一:视频拍照程序JMF的应用涉及到很多知识,为了更加直观地了解JMF,下面通过两个最常用的实例来展示JMF的应用。首先开发一个视频拍照程序。请先安装视频设备和驱动程序,并调试可用。该程序包括以下两个类。视频拍照主程序VideoCamera.java。图片显示和保存内部类ImagePanel.java。(1)视频拍照主程序VideoCamera.java该类继承自Frame并实现了ActionListener接口。首先它包含了创建视频捕捉的两个变量: privateMediaLocatormediaLocator=null;  //视频设备privatePlayerplayer=null;    //播放器然后创建一个ImagePanel对象,该类用于显示视频拍照的照片并进行文件的保存。并添加两个按钮: privateButtonok,cancel;    //拍照和重拍按钮在该类的构造函数中,首先需要分别创建主窗体、按钮面板、图片显示面板和视频面板,视频面板的创建需要先加载视频设备,并创建Player对象,然后从Player中取得视频组件Component,将该组件添加到主窗体中即可实现视频的显示。然后编写一个按钮事件处理函数,如果为"ok"按钮事件,则从player对象中取得一张图片,保存在Image对象中,调用ImagePanel显示该图像并保存。如果是"cancel"按钮事件,则清空ImagePanel的图像即可。完整的程序如程序17-11所示。程序17-11 视频拍照主程序VideoCamera.java packagecom.test.video;importjava.awt.Button;importjava.awt.Component;importjava.awt.Frame;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.Image;importjava.awt.Panel;importjava.awt.event.*;importjava.awt.image.BufferedImage;importjava.io.FileOutputStream;importjavax.media.Buffer;importjavax.media.CaptureDeviceManager;importjavax.media.Manager;importjavax.media.MediaLocator;importjavax.media.Player;importjavax.media.control.FrameGrabbingControl;importjavax.media.format.VideoFormat;importjavax.media.util.BufferToImage;importcom.sun.image.codec.jpeg.JPEGCodec;importcom.sun.image.codec.jpeg.JPEGEncodeParam;importcom.sun.image.codec.jpeg.JPEGImageEncoder;publicclassVideoCameraextendsFrameimplementsActionListener{privateMediaLocatormediaLocator=null;privatePlayerplayer=null;privateImagePanelimagePanel=null;privateButtonok,cancel;   publicVideoCamera(){//主窗口super("视频捕捉");setSize(300,500);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){player.close();System.exit(0);}});       //按钮面板Panelpanel=newPanel();ok=newButton("拍照");cancel=newButton("重拍");ok.addActionListener(this);cancel.addActionListener(this);panel.add(ok);panel.add(cancel);add(panel,"Center");       //图片面板imagePanel=newImagePanel();add(imagePanel,"South");       //视频面板CaptureDeviceManager.getDevice("vfw:MicrosoftWDMImageCapture(Win32):0");mediaLocator=newMediaLocator("vfw://0");try{player=Manager.createRealizedPlayer(mediaLocator);player.start();Componentcomp;if((comp=player.getVisualComponent())!=null)comp.setBounds(0,0,240,180);add(comp,"North");}catch(Exceptione){e.printStackTrace();}setVisible(true);}   publicvoidactionPerformed(ActionEvente){if(e.getSource()==ok){FrameGrabbingControlfgc=(FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");Bufferbuffer=fgc.grabFrame();BufferToImagebufferToImage=newBufferToImage((VideoFormat)buffer.getFormat());Imageimage=bufferToImage.createImage(buffer);imagePanel.setImage(image);saveImage(image,"D:/app/"+System.currentTimeMillis()+".jpg");}elseif(e.getSource()==cancel){imagePanel.setImage(null);}}publicstaticvoidmain(String[]args){newVideoCamera();}}17.4.4实例一:视频拍照程序(2)(2)图片显示与保存内部类ImagePanel.java在主程序中拍照后,需要调用ImagePanel来显示该图片,显示的函数为paint()。并调用saveImage()来保存图片,该函数与第一节中图片保存的过程类似,如程序17-12所示。程序17-12 图片显示与保存内部类ImagePanel.java classImagePanelextendsPanel{privatestaticfinallongserialVersionUID=1L;publicImagemyimg=null;   publicImagePanel(){setLayout(null);setSize(240,180);}   publicvoidsetImage(Imageimg){this.myimg=img;repaint();}   //显示图片publicvoidpaint(Graphicsg){if(myimg!=null){g.drawImage(myimg,0,0,this);}}//保存图片publicvoidsaveImage(Imageimage,Stringpath){//图片缓存intwidth=image.getWidth(null);intheight=image.getHeight(null);BufferedImagebi=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphics2Dg2=bi.createGraphics();g2.drawImage(image,null,null);//写入文件try{//打开文件FileOutputStreamfos=newFileOutputStream(path);//JPG编码JPEGImageEncoderje=JPEGCodec.createJPEGEncoder(fos);JPEGEncodeParamjp=je.getDefaultJPEGEncodeParam(bi);jp.setQuality(1f,false);je.setJPEGEncodeParam(jp);je.encode(bi);fos.close();}catch(Exceptione){e.printStackTrace();}}}(3)运行视频拍照程序完成以上代码后,即可运行主程序VideoCamera,就会显示如图17-12所示的窗口。   图17-12 视频程序主窗口单击"拍照"按钮,即会在下方显示抓拍的图片,同时该图片会保存在D:/app目录下。17.4.5实例二:视频播放器17.4.5 实例二:视频播放器以上的视频拍照程序输入的Player来源是硬件的摄像设备,下面通过实例来演示从一个视频文件来产生Player并进行播放的过程。类VideoPlayer继承自Frame,并实现了ControllerListener接口,该接口是JMF视频播放状态变化的事件接口。首先我们编写构造函数,来实现程序的主窗口。然后在播放函数play()中,根据一个磁盘视频文件创建了一个Player对象,并为该对象分配资源,调用的是realize()方法;该事件会触发事件处理函数controllerUpdate()中的第一个分支,并进行播放预处理,一旦完成即会触发controllerUpdate()中的第二个分支,然后通过player对象取得如下的两个组件: visual=player.getVisualComponent();    //视频播放组件control=player.getControlPanelComponent();  //视频进度控制组件将这两个组件添加到主窗口中即可。完整的代码如程序17-13所示。程序17-13 视频播放器主程序VideoPlayer.java packagecom.test.video;importjava.awt.BorderLayout;importjava.awt.Component;importjava.awt.Dimension;importjava.awt.Frame;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.io.IOException;importjava.net.URL;importjavax.media.ControllerEvent;importjavax.media.ControllerListener;importjavax.media.EndOfMediaEvent;importjavax.media.Manager;importjavax.media.NoPlayerException;importjavax.media.Player;importjavax.media.PrefetchCompleteEvent;importjavax.media.RealizeCompleteEvent;importjavax.media.Time;publicclassVideoPlayerextendsFrameimplementsControllerListener{privateintvideoWidth=0;privateintvideoHeight=0;privateintcontrolHeight=30;privateintinsetWidth=10;privateintinsetHeight=30;   privatePlayerplayer;privateComponentvisual;   //播放组件privateComponentcontrol=null;  //控制组件   publicVideoPlayer(){super("视频播放器");setSize(500,400);setVisible(true);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventwe){if(player!=null){player.close();}System.exit(0);}});}   publicvoidplay(){URLurl=null;try{//准备一个要播放的视频文件的URLurl=newURL("file:/I:/资料备份/影视/MTV/K歌之王(国)MTV.mpg");           //通过调用Manager的createPlayer方法来创建一个Player的对象//这个对象是媒体播放的核心控制对象player=Manager.createPlayer(url);}catch(NoPlayerExceptione1){e1.printStackTrace();}catch(IOExceptione1){e1.printStackTrace();}       //对Player对象注册监听器,能在相关事件发生的时候执行相关的动作player.addControllerListener(this);       //让Player对象进行相关的资源分配player.realize();}   //监听Player的相关事件publicvoidcontrollerUpdate(ControllerEventce){if(ceinstanceofRealizeCompleteEvent){//Player实例化完成后进行Player播放前预处理player.prefetch();}elseif(ceinstanceofPrefetchCompleteEvent){if(visual!=null)return;           //取得Player中的播放视频的组件,并得到视频窗口的大小//然后把视频窗口的组件添加到Frame窗口中,if((visual=player.getVisualComponent())!=null){Dimensionsize=visual.getPreferredSize();videoWidth=size.width;videoHeight=size.height;add(visual);}else{videoWidth=320;}           //取得Player中的视频播放控制条组件,并把该组件添加到Frame窗口中if((control=player.getControlPanelComponent())!=null){controlHeight=control.getPreferredSize().height;add(control,BorderLayout.SOUTH);}           //设定Frame窗口的大小,使得满足视频文件的默认大小setSize(videoWidth+insetWidth,videoHeight+controlHeight+insetHeight);validate();           //启动视频播放组件开始播放player.start();}elseif(ceinstanceofEndOfMediaEvent){//当播放视频完成后,把时间进度条恢复到开始,并再次重新开始播放player.setMediaTime(newTime(0));player.start();}}   publicstaticvoidmain(String[]args){VideoPlayervp=newVideoPlayer();vp.play();}}在main()主函数中创建该类的实例vp,即会打开视频的主窗口,如图17-13所示。   图17-13 视频播放主窗口以上我们通过两个实例演示了硬件设备的图片捕捉、电影的播放,JMF还可以进行视频的捕捉录制、视频剪辑等。JMF的功能十分强大,本文只是抛砖引玉,你可以继续深入的研究JMF,来进行丰富的多媒体功能开发。17.5本课 小结 学校三防设施建设情况幼儿园教研工作小结高血压知识讲座小结防范电信网络诈骗宣传幼儿园师德小结 17.5 本课小结到这里我们就完成了本课内容的讲解,我们将本课的实例代码打包为javamedia.zip,其包含的目录和文件如下: javamedia.zip├─lib       //JMF、MP3支持库│     customizer.jar│     jl1.0.jar│     jmf.jar│     mediaplayer.jar│     mp3spi1.9.4.jar│     multiplayer.jar│     sound.jar│     tritonus_share.jar│└─src└─com└─test├─image    //图片处理样例│     ShowImage.java│     ZoomImage.java│├─java2d    //Java2D样例│     DrawImage.java│     DrawShape.java│     DrawString.java│├─audio    //音频样例│     MusicPlayer.java│     RecordPlay.java│└─video    //视频样例VideoCamera.javaVideoPlayer.java该文件放在光盘中\source目录下,读者可以查阅该代码。17.5.1 总结本课的 知识点 高中化学知识点免费下载体育概论知识点下载名人传知识点免费下载线性代数知识点汇总下载高中化学知识点免费下载 本节课分4个大节讲解了AWT多媒体编程,共包含25个知识点,如表17-2所示。表17-2 本课知识点列表 大节内容 小节内容 对应知识点 时间安排(分钟) 图像处理 加载图像 加载图像 10 显示图像 显示图像 实例一:显示图片 实例二:缩放图片 缩放图像 二维图像绘制 Java2D简介 20 取得Graphics2D对象 设置Graphics2D属性 设置属性 创建绘制对象 创建对象 绘制对象 绘制对象 实例一:绘制图形 实例二:显示文字 实例三:显示图像 音频录制与播放 JavaSound体系结构 20 音频输入/输出原理 音频的数据格式 数据格式 音频的录制 录音 音频的播放 播放 音频的保存 保存 20 实例一:录音机程序 实例二:MP3音乐播放器 视频拍照与播放 JMF模型 10 创建Player对象 创建播放器 截取多媒体数据 截取数据 实例一:视频拍照程序 20 实例二:视频播放器 合计 100培训讲师可以参照表中最后一列的参考时间控制讲解进度,即100分钟讲完本课内容。参加培训的学生在听完讲课后,最好再回顾一遍。对于自学者来说,相对要花费差不多2倍的时间来学习这些知识点。对于本章知识点的学习,除了要学习理论知识点以外,还应该注重实践操作。下面的两个小节分别从理论和实践两个方面来为你提出学习的要求。17.5.2 要掌握的关键点对于本节课的内容,我们应该掌握如下的关键点。1.本节课所讲解的4种多媒体处理。图像处理--java.awt.image。二维图像绘制--Java2D。音频录制与播放--JavaSound。视频拍照与播放--JMF。2.二维图形绘制的过程包括如下。(1)取得Graphics2D对象。(2)设置Graphics2D属性。(3)创建绘制对象。(4)绘制对象。3.音频的处理过程包括如下。(1)创建音频的数据格式。(2)音频的录制。(3)音频的播放。(4)音频的保存。这些知识点是本节课的精华语录,不仅要记住,还应该转化为自己的东西。17.5.3 课后上机作业本节讲解了多媒体编程的基本知识,并重点演示了音频和视频的开发。请读者课后演练本节课的4个实例程序(共120分钟)。录音机程序(30分钟)。MP3音乐播放器(30分钟)。视频拍照程序(30分钟)。视频播放器程序(30分钟)。17.5.4 继续下一课:Swing图形界面开发本节课重点讲解了图像、Java2D、JavaSound、JMF及4种多媒体处理的功能,Java3D也是Java多媒体的一部分。它是一个用于编写显示和交互操作三维图形对象的程序的接口。与Java3D相同功能的库包括OpenGL、Direct3D和VRML。OpenGL是业界最为流行也是支持最广泛的一个底层3D技术,几乎所有的显卡厂商都在底层实现了对OpenGL的支持和优化。OpenGL同时也定义了一系列接口用于编程实现三维应用程序,但是这些接口使用C(C++)语言实现并且很复杂。Direct3D是Microsoft公司推出的三维图形编程API,它主要应用于三维游戏的编程。众多优秀的三维游戏都是由这个接口实现。与OpenGL一样,Direct3D的实现主要使用C++语言。VRML2.0(VRML97)自1997年12月正式成为国际标准之后,在网络上得到了广泛的应用,这是一种比BASIC、JavaScript等还要简单的语言。脚本化的语句可以编写三维动画片、三维游戏、计算机三维辅助教学。它最大的优势在于可以嵌在网页中显示,但这种简单的语言功能较弱(如目前没有形体之间的碰撞检查功能)。本节课的内容意在抛砖引玉,让读者了解Java所提供的多媒体功能,Java在多媒体和界面开发上功能也是十分强大的。在下一节课中,我们将讲解Java提供的另一种图形界面开发库Swing。
本文档为【mp3播放器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥12.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
xxj7584
暂无简介~
格式:doc
大小:324KB
软件:Word
页数:0
分类:
上传时间:2020-07-06
浏览量:258