java 媒体_Java多媒体编程应用

1. 声音文件的播放

1.1 在Applet中播放声音

在Applet中,可以使用AudioClip来播放声音,它非常简单,只有三个方法:play()、loop()和stop()。

例1.1 利用AudioClip播放声音文件。

packageduomeiti;importjava.applet.Applet;importjava.applet.AudioClip;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;public class playMusic extends Applet implementsActionListener {

AudioClip clip= null;

JButton playBtn,loopBtn,stopBtn;public voidinit(){

playBtn= new JButton("播放");

loopBtn= new JButton("循环");

stopBtn= new JButton("停止");

playBtn.addActionListener(this);

loopBtn.addActionListener(this);

stopBtn.addActionListener(this);

add(playBtn);

add(loopBtn);

add(stopBtn);

clip= getAudioClip(getCodeBase(),"test.wav");

}public voidactionPerformed(ActionEvent e) {if(e.getSource()==playBtn)

clip.play();else if(e.getSource()==loopBtn)

clip.loop();elseclip.stop();

}

}

1.2 在Application中播放声音

它的一般用法是,先用AudioStream创建一个音频流对象,而后将此对象作为参数传递给AudioPlayer.player.start()方法以便播放。虽然AudioPlayer.player中只有start()和stop()两个方法,但是start()方法会从音频流对象上次停止播放的位置开始播放,而不是从头开始播放。所以用stop()暂停一个音频流的播放后,可以使用start()继续播放。

例1.2 在Application中播放声音文件。

packageduomeiti;importjava.awt.Container;importjava.awt.FlowLayout;importjava.awt.HeadlessException;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;import javax.swing.*;importsun.audio.AudioPlayer;importsun.audio.AudioStream;public class playAudio implementsActionListener {protectedJTextField fileField;protectedJButton openBtn,startBtn,pauseBtn,resumBtn,stopBtn;protectedContainer con;protectedJFrame jf;protectedAudioStream as;protectedFileInputStream fis;publicplayAudio(){

jf= new JFrame("播放声音");

con=jf.getContentPane();

con.setLayout(newFlowLayout());

fileField= newJTextField();

fileField.setColumns(30);

openBtn= new JButton("选择文件");

startBtn= new JButton("开始播放");

pauseBtn= new JButton("暂停播放");

resumBtn= new JButton("继续播放");

stopBtn= new JButton("停止播放");

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);

jf.setSize(500, 400);

jf.setLocation(300, 200);

jf.setVisible(true);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}public voidactionPerformed(ActionEvent e) {

Object obj;

obj=e.getSource();try{if(obj==openBtn)

openfile();else if(obj==startBtn){if(fis!=null) fis.close();

fis= newFileInputStream(fileField.getText());

as= newAudioStream(fis);

AudioPlayer.player.start(as);

}else if(obj==pauseBtn)

AudioPlayer.player.stop(as);else if(obj==resumBtn)

AudioPlayer.player.start(as);else if(obj==stopBtn){

AudioPlayer.player.stop(as);

as.close();

fis.close();

fis= null;

}

}catch(FileNotFoundException e1) {

JOptionPane.showMessageDialog(jf,"文件没有找到!");

}catch(IOException e1) {

JOptionPane.showMessageDialog(jf,"无法播放文件!");

}

}private voidopenfile() {try{

JFileChooser chooser= newJFileChooser();if(chooser.showOpenDialog(jf)==JFileChooser.APPROVE_OPTION)

fileField.setText(chooser.getSelectedFile().toString());

}catch(Exception e) {

JOptionPane.showMessageDialog(jf,"无法加载文件!");

}

}public static voidmain(String[] args) {newplayAudio();

}

}

2. 基本图形处理

2.1 图形的缩放

例2.1 缩放图形示例

packageduomeiti;importjava.awt.Color;importjava.awt.Graphics;import javax.swing.*;public classResizeOval {

JFrame jf;

MyCanvas palette;public class MyCanvas extendsJPanel{protected voidpaintComponent(Graphics g) {intheight,width;

height=getHeight();

width=getWidth();

g.setColor(Color.RED);

g.fillOval(0, 0, width, height);

}

}publicResizeOval(){

jf= new JFrame("图形缩放示例");

palette= newMyCanvas();

jf.getContentPane().add(palette);

jf.setSize(500, 400);

jf.setLocation(300,200);

jf.setVisible(true);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}public static voidmain(String[] args) {newResizeOval();

}

}

2.2 淡入淡出效果

要实现淡入淡出效果方法非常简单,只要采用HSB(色调-饱和度-亮度)模式设置色彩,其中的色调和亮度不必变化,只要调整饱和度的值即可。如果是淡入,则让饱和度逐步增加;如果是淡出,则让饱和度逐步减少。

例2.2 淡入淡出效果示例。

packageduomeiti;importjava.awt.Color;importjava.awt.Container;importjava.awt.FlowLayout;importjava.awt.Graphics;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;import javax.swing.*;public classfadeInOut {

JFrame jf;

JPanel jp;

Container con;

dealPushBtn handleBtn;

JButton btn;public class dealPushBtn implementsActionListener{public voidactionPerformed(ActionEvent e) {

Graphics g=jp.getGraphics();float h = 0.0f;float s = 0.0f;float b = 1.0f;for(int i=0;i<100;i++){

g.setColor(Color.getHSBColor(h, s, b));

g.fillRect(0, 50, 300, 300);try{

Thread.sleep(50);

}catch(InterruptedException e1) {

e1.printStackTrace();

}

s+=0.01;

}for(int i=0;i<100;i++){

g.setColor(Color.getHSBColor(h, s, b));

g.fillRect(0, 50, 300, 300);try{

Thread.sleep(50);

}catch(InterruptedException e1) {

e1.printStackTrace();

}

s-=0.01;

}

}

}publicfadeInOut(){

jf= new JFrame("色彩淡入淡出示例");

jp= newJPanel();

jp.setLayout(newFlowLayout());

handleBtn= newdealPushBtn();

btn= new JButton("开始");

btn.addActionListener(handleBtn);

con=jf.getContentPane();

jp.add(btn);

con.add(jp);

jf.setSize(300, 300);

jf.setLocation(300, 200);

jf.setVisible(true);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}public static voidmain(String[] args) {newfadeInOut();

}

}

2.3  透明效果

设置前景色的透明度,可以使得前景色和后景色能够混合起来,这需要使用Graphics2D类。

例2.3 色彩混合效果示例。

packageduomeiti;importjava.awt.AlphaComposite;importjava.awt.Color;importjava.awt.Composite;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.Rectangle;import javax.swing.*;public class TransparencyExample extendsJPanel {private static int gap=10, width=40, offset=10,deltax=gap+width+offset;private Rectangle blueSquare = new Rectangle(gap+offset,gap+offset,width,width),

redSquare= newRectangle(gap,gap,width,width);//创建一个指定alpha值的AlphaComposite对象

private AlphaComposite makeComposite(floatalpha){int type =AlphaComposite.SRC_OVER;return(AlphaComposite.getInstance(type, alpha));

}//用指定的alpha值来绘制前景色

private void drawSquares(Graphics2D g2d,floatalpha){

Composite originalComposite=g2d.getComposite();//用默认透明度绘制背景蓝色

g2d.setPaint(Color.blue);

g2d.fill(blueSquare);//设置透明度,准备绘制前景红色

g2d.setComposite(makeComposite(alpha));

g2d.setPaint(Color.red);

g2d.fill(redSquare);//将透明度设置回默认的模式

g2d.setComposite(originalComposite);

}//分别用不同的透明度来绘制颜色

public voidpaintComponent(Graphics g){super.paintComponent(g);

Graphics2D g2d=(Graphics2D)g;for(int i=0;i<11;i++){//alpha值逐步增大,透明度逐步减小

drawSquares(g2d,i*0.1F);

g2d.translate(deltax,0);

}

}

}

packageduomeiti;import javax.swing.*;import java.awt.*;public classmixing {

JFrame jf;

TransparencyExample palette;publicmixing(){

jf= new JFrame("色彩混合示例");

palette= newTransparencyExample();

jf.getContentPane().add(palette);

jf.setSize(700, 400);

jf.setLocation(300, 200);

jf.setVisible(true);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}public static voidmain(String[] args) {newmixing();

}

}

3. 字体的处理

3.1 确定可用字体

例3.1 获取系统中安装的字体示例。

packageduomeiti;importjava.awt.GraphicsEnvironment;import javax.swing.*;public classGetFonts {privateJFrame jf;privateJList nameList;privateJScrollPane nameSPane;publicGetFonts(){

jf= new JFrame("获取系统字体");//获得GraphicsEnvironment类型的对象引用

GraphicsEnvironment eq =GraphicsEnvironment.getLocalGraphicsEnvironment();//获取所有的字体家族名

String[] availableFonts =eq.getAvailableFontFamilyNames();//存放到列表框中

nameList = newJList(availableFonts);

nameSPane= newJScrollPane(nameList);

jf.add(nameSPane);

jf.setSize(500, 400);

jf.setLocation(300, 200);

jf.setVisible(true);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}public static voidmain(String[] args) {newGetFonts();

}

}

3.2 创建字体对象

例3.2 创建和使用字体示例。

packageduomeiti;import javax.swing.*;import java.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;public class ShowFonts implementsActionListener {privateJFrame jf;privateJComboBox nameBox,styleBox;privateJTextField sizeText;privateJLabel fontLabel;privateJButton showBtn;privateJPanel panel;publicShowFonts(){

jf= new JFrame("显示指定字体");//显示系统可用字体

GraphicsEnvironment eq =GraphicsEnvironment.getLocalGraphicsEnvironment();

String[] availableFonts=eq.getAvailableFontFamilyNames();

nameBox= newJComboBox(availableFonts);

nameBox.setEditable(true);

nameBox.setSelectedItem("宋体");//显示字体风格由用户选择

String[] style = {"正常","粗体","斜体","粗斜体"};

styleBox= newJComboBox(style);

styleBox.setEditable(false);//由用户输入想要的字体尺寸

sizeText = new JTextField("12");

sizeText.setColumns(4);//标签用于显示用户选择的字体

fontLabel = new JLabel("字体示例");//创建按钮并安装监听器

showBtn = new JButton("显示字体");

showBtn.addActionListener(this);//在窗口中排列组件

panel = newJPanel();

panel.setLayout(newFlowLayout());

panel.add(nameBox);

panel.add(styleBox);

panel.add(sizeText);

jf.add(panel, BorderLayout.NORTH);

jf.add(fontLabel, BorderLayout.CENTER);

jf.add(showBtn, BorderLayout.SOUTH);

jf.setSize(500, 400);

jf.setLocation(300, 200);

jf.setVisible(true);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}public voidactionPerformed(ActionEvent e) {//分别获取用户选择输入的字体信息

int styleIndex =styleBox.getSelectedIndex();

String fontStr=(String)nameBox.getSelectedItem();int fontSize =Integer.parseInt(sizeText.getText());//组合字体对象

Font userFont = newFont(fontStr,styleIndex,fontSize);//为标签设置新的字体并显示

fontLabel.setFont(userFont);

}public static voidmain(String[] args) {newShowFonts();

}

}

4. 字体的展示处理

例4.1 自行管理字体示例。

packageduomeiti;import javax.swing.*;import java.awt.*;public class FontsCanvas extendsJPanel {privateString msg;publicFontsCanvas(String s){

msg=s;

setBackground(Color.white);

}publicFontsCanvas(){this("自行管理字体示例");

}public voidpaintComponent(Graphics g){int maxWidth = getWidth(); //获取画布的宽度

int showX; //文字输出的横坐标位置

int showY = 0; //文字输出的纵坐标位置

int descent = 0; //文字下半部所占位置

int ascent = 0; //文字上半部所占位置

int leading = 0; //行间距

int totalWidth; //字符串所占宽度

FontMetrics fm; //用于自行管理字体

Font myFonts [] = new Font[4];//创建不同的字体准备显示

myFonts[0] = new Font("宋体",Font.PLAIN,12);

myFonts[1] = new Font("仿宋",Font.BOLD,24);

myFonts[2] = new Font("黑体",Font.ITALIC,48);

myFonts[3] = new Font("楷体_GB2312",Font.ITALIC|Font.BOLD,60);//用上述4种不同的字体显示同一个字符串,右对齐

for(int i=0;i

g.setFont(myFonts[i]);

fm=g.getFontMetrics();

totalWidth=fm.stringWidth(msg);

showX= maxWidth -totalWidth;

ascent=fm.getMaxAscent();

showY= showY + descent + ascent +leading;

descent=fm.getMaxDescent();

leading=fm.getLeading();

g.drawString(msg, showX, showY);

}

}

}

packageduomeiti;import javax.swing.*;import java.awt.*;public classManageFonts {privateJFrame jf;private FontsCanvas palette; //可以显示多种文字的画布

publicManageFonts(){

jf= new JFrame("自行管理字体示例");

palette= newFontsCanvas();

jf.add(palette);

jf.setSize(500, 400);

jf.setLocation(300, 200);

jf.setVisible(true);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}public static voidmain(String[] args) {newManageFonts();

}

}

5. 字体的特效显示

例5.1 字体特效显示示例。

packageduomeiti;importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.Container;importjava.awt.Font;importjava.awt.FontMetrics;importjava.awt.Graphics;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.Timer;importjava.util.TimerTask;import javax.swing.*;public class LightingLiteral implementsActionListener {

String title= "光照文字"; //显示的文字

Font myFont = new Font("宋体",Font.BOLD,48); //显示的字体

JPanel palette;

JFrame jf;

JButton startBtn;

Container con;

Timer myTimer;

Refresh task;booleanstartFlag;publicLightingLiteral(){

jf= newJFrame(title);

palette= newJPanel();

startBtn= new JButton("开始");

startFlag= true;

startBtn.addActionListener(this);

con=jf.getContentPane();

con.add(palette, BorderLayout.CENTER);

con.add(startBtn, BorderLayout.NORTH);

jf.setSize(500, 400);

jf.setLocation(300, 200);

jf.setVisible(true);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}public voidactionPerformed(ActionEvent e) {if(startFlag){

myTimer= newTimer();

task= newRefresh();

myTimer.schedule(task,50, 50); //启动定时器,时间间隔为50毫秒

startBtn.setText("停止");

}else{

myTimer.cancel();

myTimer= null;

task= null;

startBtn.setText("开始");

}

startFlag= !startFlag;

}//用定时器来绘图

class Refresh extendsTimerTask{int pos = 0;int blink_width = 20; //光条的宽度

Graphics g = palette.getGraphics(); //注意画笔的获取方式

FontMetrics myFM =g.getFontMetrics(myFont);int height = myFM.getHeight(); //计算文字的高度

int top =myFM.getAscent();int width =myFM.stringWidth(title);publicRefresh(){

g.setFont(myFont);

}public voidrun() {

g.setColor(Color.blue);

g.drawString(title,0, top); //第一遍显示

g.clipRect(pos, 0, blink_width, height); //设置裁剪区域

g.setColor(Color.yellow);

g.drawString(title,0, top); //第二遍显示,它只会显示在裁剪区域中

pos = (pos + 5) % width; //移动裁剪区域的位置

g.setClip(null); //让裁剪区域失效,准备重新绘制蓝色文字

}

}public static voidmain(String[] args) {newLightingLiteral();

}

}

JAVA多媒体开发手册,Java多媒体框架(JMF)中包含了许多用于处理多媒体的API。它是一个相当复杂的系统,完全了解这个系统可能需要花上几周的时间,但是这篇文章将主要介绍JMF的几个核心接口和,然后通过一个简单的例子向你展示如何利用该接口进行编程。 JMF目前的最新版本是2.1,Sun通过它向Java中引入处理多媒体的能力。下面是JMF所支持的功能的一个概述: ● 可以在Java Applet应用程序播放各种媒体文件,例如AU、AVI、MIDI、MPEG、QuickTime和WAV等文件。 ● 可以播放从互联网上下载的媒体流。 ● 可以利用麦克风和摄像机一的设备截取音频和视频,并保存成多媒体文件。 ● 处理多媒体文件,转换文件格式。 ● 向互联网上传音频和视频数据流。 ● 在互联网上广播音频和视频数据。 JMF的结构 为了更好地说明JMF的结构,让我们用立体声音响做一个简单的比喻。当你CD机播放CD唱片的时候,CD唱片向系统提供音乐信号。这些数据是在录音棚中用麦克风和其他似的设备记录下来的。CD播放机将音乐信号传送到系统的音箱上。在这个例子中,麦克风就是一个音频截取设备,CD唱片是数据源,而音箱是输出设备。 JMF的结构和立体声音响系统非常相似,在后面的文章中,你会遇到下面的这些术语: ● 数据源(Data source) ● 截取设备(Capture Device,包括视频和音频截取设备) ● 播放器(Player) ● 处理器(Processor) ● 数据格式(Format) ● 管理器(Manager) 下面让我们来看一看这些术语到底代表什么意思。 1.数据源 就像CD中保存了歌曲一样,数据源中包含了媒体数据流。在JMF中,DataSource对象就是数据源,它可以是一个多媒体文件,也可以是从互联网上下载的数据流。对于DataSource对象,一旦你确定了它的位置和型,对象中就包含了多媒体的位置信息和能够播放多媒体的软件信息。当创建了DataSource对象后,可以将它送入Player对象中,而Player对象不需要关心DataSource中的多媒体是如何获得的,以及格式是什么。 在某些情况下,你需要将多个数据源合并成一个数据源。例如当你在制作一段录像时,你需要将音频数据源和视频数据源合并在一起。JMF支持数据源合并,在后面的例子中我们将提到这一点。 2.截取设备 截取设备指的是可以截取到音频或视频数据的硬件,如麦克风、摄像机等。截取到的数据可以被送入Player对象中进行处理。 3.播放器 在JMF中对应播放器的接口是Player。Player对象将音频/视频数据流作为输入,然后将数据流输出到音箱或屏幕上,就像CD播放机读取CD唱片中的歌曲,然后将信号送到音箱上一样。Player对象有多种状态,JMF中定义了JMF的六种状态,在正常情况下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,它一种播放器。在JMF API中,Processor接口继承了Player接口。 Processor对象除了支持支持Player对象支持的所有功能,还可以控制对于输入的多媒体数据流进行何种处理以及通过数据源向其他的Player对象或Processor对象输出数据。 除了在播放器中提到了六种状态外,Processor 对象还包括两种新的状态,这两种状态是在Unrealized状态之后,但是在Realizing状态之前。 ● Configuring:当调用configure()方法后,Processor对象进入该状态。在该状态下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值