您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > 第15-16章 多媒体程序设计
第15章多媒体程序设计多媒体是融合两种或者两种以上媒体的一种人机交互式信息交流和传播媒体,使用的媒体包括文字、图形、图像、声音、动画和电视图像(video)。本章将介绍如何使用Java提供的工具包来编写播放图像、音频、视频的程序。15.1声音文件的播放声音是携带信息的极其重要的媒体,是多媒体技术研究中的一个重要内容。声音的种类繁多,如人的话音、乐器声、动物发出的声音、机器产生的声音以及自然界的雷声、风声、雨声、闪电声等。这些声音有许多共同的特性,也有它们各自的特性。在用计算机处理这些声音时,既要考虑它们的共性,又要利用它们各自的特性。为了适应各种需要,声音的格式非常多,如WAV、MP3、AU、AIFF、RMF、MIDI等。作为Java应用程序员,并不需要掌握这些格式的解析,因为Java已经提供了现成的类来播放这些格式的文件。下面简要介绍一下各种声音文件格式的特点。AU(扩展名为AU或SND):适用于短的声音文件,为Solaris和下一代机器的通用文件格式,也是Java平台标准的音频格式。AU类型文件使用的三种典型音频格式为:8位μ-law类型(通常采样频率为8kHz)、8位线性类型,以及16位线性类型。WAV(扩展名为WAV):由Microsoft和IBM共同开发,对WAV的支持已经被加进Windows95并且被延伸到后继的所有Windows操作系统。WAV文件能存储各种格式,包括μ-law、a-law和PCM(线性)数据。它们几乎能被所有支持声音的Windows应用程序播放。AIFF(扩展名为AIF或IEF):音频互换文件格式,是为Macintosh计算机和SiliconGraphics(SGI)计算机所共用的标准音频文件格式。AIFF和AIFF-C几乎是相同的,除了后者支持例如μ-law和IMAADPCM类型的压缩。MIDI(扩展名为MID):乐器数字接口,MIDI是为音乐制造业所认可的标准,主要用于控制诸如合成器和声卡之类的设备。MIDI文件不包含数字音频采样,而是包括一系列指令,通过这些指令把来自不同乐器上的音符序列合成乐曲。一些MIDI文件包含附加指令来为各种合成设置进行编程。大多数合成器支持MIDI标准,所以在一个合成器上制作的音乐能够在另一个合成器上播放。有MIDI接口的计算机能处理MIDI数据以产生新音乐或音响效果。例如,一个完整的音乐作品可以通过一个软件驱动的命令转换成全新的形式。Java声音引擎支持两种MIDI文件第15章多媒体程序设计·585·类型:MIDI类型0文件,包含仅仅一个序列,所有相关的乐器部分被包含在同一个逻辑“磁道”上。MIDI类型1文件,包含多重的“磁道”使得不同的乐器被逻辑地分开,从而使对声音的操作和重组更加容易。RMF(扩展名为RMF):混合音乐格式,是由Beatnik设计出来的混合文件类型,通过交互式设定将MIDI和音频采样封装在一起。RMF好比是一个所有音乐相关文件的容器。RMF也包含对有关版权的详细文件说明的支持。RMF文件可以包含多个由不同艺术家创作的,存储为,MIDI类型或音频采样类型的作品,每个都关联着相关的版权信息。Java的标准类库中有两种方法可用于播放声音,一个是AudioClip接口,它在java.applet包中;一个是AudioStream和AudioPlayer配合使用,它们在sun.audio包中。前者只能用在applet中,后者可用在应用程序中。15.1.1在Applet中使用AudioClip播放声音在Applet中,可以使用AudioClip来播放声音,它非常简单,只有三个方法:play()、loop()、stop()。所以编程也非常简单,但是功能也比较少。也许Java的设计者认为在网页中播放背景音乐,有这几个简单的功能就够用了。由于AudioClip是接口,所以不能直接使用它来生成对象。但可以声明一个AudioClip变量,然后用applet类中的getAudioClip()来获取一个实例对象,再使用它的play()方法来播放声音。下面是个简单的例子。【例15.1】利用AudioClip播放声音文件。//-----------文件名playMusic.java,程序编号15.1-----------------importjava.awt.event.*;importjavax.swing.*;importjava.applet.*;publicclassplayMusicextendsAppletimplementsActionListener{AudioClipclip=null;JButtonplayBtn,loopBtn,stopBtn;publicvoidinit(){playBtn=newJButton(播放);loopBtn=newJButton(循环);stopBtn=newJButton(停止);playBtn.addActionListener(this);loopBtn.addActionListener(this);stopBtn.addActionListener(this);add(playBtn);add(loopBtn);add(stopBtn);//获取一个对象实例,test.wav是要播放的声音文件clip=getAudioClip(getCodeBase(),test.wav);}publicvoidactionPerformed(ActionEvente){if(e.getSource()==playBtn)Java开发技术大全·586·clip.play();//播放声音elseif(e.getSource()==loopBtn)clip.loop();//循环播放elseclip.stop();//停止播放}}15.1.2在Application中播放声音如果要在Application中播放声音,就不能使用AudioClip,而应该用AudioStream和AudioPlayer配合起来播放。它们的功能比AudioClip稍强一些,编程也稍微复杂一点。AudioStream和AudioPlayer不是Java标准包中的类,而是sun.audio包中的类。其中,AudioStream需要定义对象才能使用,而AudioPlayer中有一个静态的player变量,它其中都是静态方法,可以直接使用(类似于System.out变量)。它们的一般用法是,先用AudioStream创建一个音频流对象,而后将此对象作为参数传递给AudioPlayer.player.start()方法以便播放。虽然AudioPlayer.player中只有start()和stop()两个方法,但是start()方法会从音频流对象上次停止播放的位置开始播放,而不是从头开始,所以用stop()暂停一个音频流的播放后,可以使用start()继续播放。下面的例子演示了如何使用这两个方法实现播放、暂停、继续播放和停止4个功能。【例15.2】在Application中播放声音文件。//-----------文件名playAudio.java,程序编号15.2-----------------importjavax.swing.*;importjava.awt.event.*;importsun.audio.*;//AudioStream和AudioPlayer在此包中importjava.awt.*;importjava.io.*;publicclassplayAudioimplementsActionListener{protectedJTextFieldfileField;protectedJButtonopenBtn,startBtn,pauseBtn,resumBtn,stopBtn;protectedContainercon;protectedJFramemainJframe;protectedAudioStreamas;//声明音频流对象protectedFileInputStreamfileau;publicplayAudio(){mainJframe=newJFrame(播放声音);con=mainJframe.getContentPane();con.setLayout(newFlowLayout());fileField=newJTextField();fileField.setColumns(30);openBtn=newJButton(选择文件);startBtn=newJButton(开始播放);pauseBtn=newJButton(暂停播放);第15章多媒体程序设计·587·resumBtn=newJButton(继续播放);stopBtn=newJButton(停止播放);openBtn.addActionListener(this);startBtn.addActionListener(this);pauseBtn.addActionListener(this);resumBtn.addActionListener(this);stopBtn.addActionListener(this);con.add(fileField);con.add(openBtn);con.add(startBtn);con.add(pauseBtn);con.add(resumBtn);con.add(stopBtn);mainJframe.setSize(400,200);mainJframe.setVisible(true);mainJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicvoidactionPerformed(ActionEvente){Objectobj;obj=e.getSource();try{if(obj==openBtn){//让用户选择音频文件openfile();}elseif(obj==startBtn){//播放音频文件if(fileau!=null)fileau.close();fileau=newFileInputStream(fileField.getText());as=newAudioStream(fileau);//创建音频流对象AudioPlayer.player.start(as);//从头开始播放音频流}elseif(obj==pauseBtn){//暂停音频流的播放AudioPlayer.player.stop(as);}elseif(obj==resumBtn){//继续从上次暂停的地方开始播放AudioPlayer.player.start(as);}elseif(obj==stopBtn){//停止音频流的播放AudioPlayer.player.stop(as);as.close();//关闭音频流fileau.close();fileau=null;}}catch(Exceptionel){JOptionPane.showMessageDialog(mainJframe,无法播放文件!);}}privatevoidopenfile(){try{JFileChooserchooser=newJFileChooser();if(chooser.showOpenDialog(mainJframe)==JFileChooser.APPROVE_OPTION)fileField.setText(chooser.getSelectedFile().toString());}catch(Exceptione){Java开发技术大全·588·JOptionPane.showMessageDialog(mainJframe,无法加载文件!);}}publicstaticvoidmain(Stringargs[]){newplayAudio();}}图15.1是程序运行时的截图。图15.1程序运行
本文标题:第15-16章 多媒体程序设计
链接地址:https://www.777doc.com/doc-1482791 .html