java简单媒体播放器源码.
java视频播放器源代码
import java.awt.*;import java.io.*;import java.util.*;import javax.media.*;import javax.media.format.*;import javax.swing.*;public class VideoPlayer implements ControllerListener {Vector audioCapDevList = null;Vector videoCapDevList = null;CaptureDeviceInfo audioCapDevInfo = null;CaptureDeviceInfo videoCapDevInfo = null;MediaLocator audioCapDevLoc = null;MediaLocator videoCapDevLoc = null;Player audioPlayer;Player videoPlayer;public void initAudioCapDevLoc() {//这里可以填写其它的音频编码格式,具体请看AudioFormat类audioCapDevList = CaptureDeviceManager.getDeviceList(new AudioFormat(AudioFormat.LINEAR));if ((audioCapDevList.size() > 0)) {//或许有几个CaptureDevice,这里取第一个audioCapDevInfo = (CaptureDeviceInfo) audioCapDevList.elementAt(0);audioCapDevLoc = audioCapDevInfo.getLocator();} else {System.out.println("找不到音频采集设备");System.exit(0);}}public void initVideoCapDevLoc() {//这里可以填写其它的编码视频格式,具体请看VideoFormat类videoCapDevList = CaptureDeviceManager.getDeviceList(new VideoFormat(VideoFormat.YUV));if ((videoCapDevList.size() > 0)) {//或许有几个CaptureDevice,这里取第一个videoCapDevInfo = (CaptureDeviceInfo)videoCapDevList.elementAt(0);videoCapDevLoc = videoCapDevInfo.getLocator();} else {System.out.println("找不到视频采集设备");System.exit(0);}}public void initAudioPlayer() {try {audioPlayer = Manager.createPlayer(audioCapDevLoc);} catch (NoPlayerException ex) {} catch (IOException ex) {}//增加一个侦听器,侦听player状态的改变audioPlayer.addControllerListener(this);audioPlayer.realize();}public void initVideoPlayer() {try {videoPlayer = Manager.createPlayer(videoCapDevLoc);} catch (NoPlayerException ex) {} catch (IOException ex) {}//增加一个侦听器,侦听player状态的改变videoPlayer.addControllerListener(this);videoPlayer.realize();}public void stopAndClosePlayer(){audioPlayer.stop();audioPlayer.close();videoPlayer.stop();videoPlayer.close();}public synchronized void controllerUpdate(ControllerEvent ce) { Player p = (Player) ce.getSourceController();JFrame jFrame = new JFrame();Component com;if (p == null) {return;}//如果player的状态变为Realizedif (ce instanceof RealizeCompleteEvent) {if ((com = p.getControlPanelComponent()) != null) {jFrame.add(com, BorderLayout.SOUTH);}if ((com = p.getVisualComponent()) != null) {jFrame.add(com, BorderLayout.NORTH);}jFrame.setVisible(true);jFrame.pack();jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); p.start();}}public static void main(String args[]) {V ideoPlayer cap = new VideoPlayer();cap.initAudioCapDevLoc();cap.initVideoCapDevLoc();cap.initAudioPlayer();cap.initVideoPlayer();try {Thread.currentThread().sleep(20000);//20秒后停止并关闭播放器 } catch (InterruptedException ex) {}cap.stopAndClosePlayer();}}。
毕业设计(论文)-基于java的mp3播放器jmplayer[管理资料]
基于JA V A的Mp3播放器JMPlayer作者姓名专业计算机科学与技术指导教师姓名专业技术职务讲师山东轻工业学院本科毕业设计(论文)原创性声明本人郑重声明:所呈交的毕业论文,是本人在指导教师的指导下独立研究、撰写的成果。
论文中引用他人的文献、数据、图件、资料,均已在论文中加以说明,除此之外,本论文不含任何其他个人或集体已经发表或撰写的成果作品。
对本文研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示了谢意。
本声明的法律结果由本人承担。
毕业论文作者签名:年月日山东轻工业学院关于毕业设计(论文)使用授权的说明本毕业论文作者完全了解学校有关保留、使用毕业论文的规定,即:学校有权保留、送交论文的复印件,允许论文被查阅和借阅,学校可以公布设计论文的全部或部分内容,可以采用影印、扫描等复制手段保存本论文。
指导教师签名:毕业设计(论文)作者签名:年月日年月日目录摘要 (III)ABSTRACT (IV)第一章引言 (1)课题研究背景及意义 (1)音乐播发器的发展及历史 (1)系统开发目标 (2)本文的主要内容和结构 (2)第二章相关工具及技术介绍 (1)Eclipse简介 (3)Java Thread简介 (4)JavaSound简介 (5)Java Swing简介 (6)Java Properties简介 (7)第三章需求分析 (9)工作流程分析 (9)评价具体需求分析 (9)系统功能结构图 (9)功能详细描述 (10)Mp3播放 (10)播放控制 (10)播放信息控制 (10)Mp3列表管理 (11)歌词 (11)其他 (11)第四章总体设计 (12)系统要求 (12)系统功能描述 (12)系统运行环境 (13)系统设计思想 (13)总体流程设计 (13)Mp3播放设计 (14)播放模式设计 (15)Mp3文件列表管理设计 (15)歌词设计 (16)皮肤切换设计 (17)显示模式设计 (18)第五章详细设计 (19)界面设计 (19)系统关键类设计 (20)系统类结构 (22)第六章软件功能实现 (23)播放Mp3实现 (23)Mp3文件解析实现 (23)Mp3列表控制类实现 (23)Mp3歌词解析及显示控制实现 (23)结束语 (25)参考文献 (24)致谢 (27)摘要随着java 语言的出现,软件的跨平台性已经能被更进一步的解决和处理,随着Internet的发展,软件的跨平台性又被提高到另一个新的要求。
JMF(Java Media Framework)基础教程
Hi, Java媒体架构基础内容表格1. 关于此指南2. 一个简单的音频播放器3. JMF用户接口组件4. JMF概念5. 传播和接收媒体6. 总结以及资源第一节. 关于此指南此指南包含的内容?Java 媒体架构(JMF)是一个令人激动的通用的API,它允许Java开发者用许多不同的方法处理媒体。
本指南主要通过使用工作的例子提供一个JMF的一些主要的特征的概述。
阅读完本指南后,你将会明白JMF体系结构中的主要播放功能。
你同样能正确的使用JMF,使用现存的例子和可为更多特殊功能扩展的源代码。
本指南包含着以下主题:· 下载和安装JMF· 主要的JMF类以及它们在JMF体系结构中的应用· 播放本地的媒体文件· 为媒体的存取和操作制作以和图形用户界面(GUI)· 通过网络传播媒体· 通过网络接收媒体几乎所有的媒体类型的操作和处理都可以通过JMF来实现。
全面的讨论JMF所提供的所有特征已经超过了本指南的范围,我们将使用三个简单的媒体应用程序来学习此框架的构建模块。
通过这个方法,本指南将为你未来学习和实施更多特殊的应用提供准备。
我应该使用此指南吗?本指南会带你学习使用JMF工作的基础。
为完成这些,我们会创建三个的独立工作的例程序。
每个例子都会建立前一个例子的基础上,显示JMF功能性的不同方面。
在本指南中的例子假定你曾经使用过并且已经熟悉了Java程序语言。
除了Java 核心和JMF的类之外,我们会使用一些Java AWT和Swing类(用于创建GUI),也会有一些Java网络类(用于在网络中传输媒体)。
对GUI和网络类一些熟悉有助于你更快的明白观点和这里的例子,但并非是阅读本指南必须的。
我们将学习的例程序如下· 一个简单的音频播放器(JMF的HelloWorld应用):这个字符界面的播放器通过在命令行中简单的输入媒体文件的名字就可以播放大多数的音频类型。
用JMF构建媒体播放器(1)
try { //准备一个要播放的视频文件的URL url = new URL("file:/d:/2.mpg"); } catch (MalformedURLException e) { e.printStackTrace(); } try { //通过调用Manager的createPlayer方法来创建一个Player的对象 //这个对象是媒体播放的核心控制对象 player = Manager.createPlayer(url); } catch (NoPlayerException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); }
JMF(Java Media Frame ,rk)即Java媒体框架, 是sun公司推出的一个应用程序接口,可 以实现音频、视频信号的采集、存储、 和传输,支持压缩的媒体流及存储媒体 的同步、控制、处理和播放。JBuilder x是 Borland公司推出的可视化Java语言编程工 具,它提供了一个功能强大的集成开发 环境,可以方便地创建各种Java应用程和 小应用程
实例代码:
package com.bird.jmf; import java.awt.BorderLayout; import ponent; import java.awt.Dimension; import java.awt.Frame; import java.awt.Panel; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import .MalformedURLException; import .URL; import javax.media.CannotRealizeException; import javax.media.ControllerEvent; import javax.media.ControllerListener; import javax.media.EndOfMediaEvent; import javax.media.Manager; import javax.media.MediaLocator; import javax.media.NoPlayerException; import javax.media.Player; import javax.media.PrefetchCompleteEvent; import javax.media.RealizeCompleteEvent; import javax.media.Time;
一个简单音乐播放器代码
一个简单音乐播放器代码package bofang;import java.io.IOException;import com.example.bofang.R;import android.content.Intent;import android.media.MediaPlayer;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class Activity extends android.app.Activity{ private Button bt1;private Button bt2;private MediaPlayer player;//mediaplayer对象private boolean isplaying;//是否播放@Overrideprotected void onCreate(Bundle savedInstanceState) { // TODO自动生成的方法存根super.onCreate(savedInstanceState);setContentView(yout.activity);bt1=(Button)findViewById(R.id.bt1);bt2=(Button)findViewById(R.id.bt2);bt3.setOnClickListener(new OnClickListener() {bt1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO自动生成的方法存根playOrpauseMusic();}});bt2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO自动生成的方法存根stopMusic();}});init();}private void playOrpauseMusic() {// TODO自动生成的方法存根isplaying=player.isPlaying();if(isplaying){player.pause();bt1.setText("播放");}else{player.start();bt1.setText("暂停");//setimageresource(r.drawable.play)设置更换图片资源位置}bt2.setEnabled(true);}private void stopMusic() {// TODO自动生成的方法存根player.stop();bt1.setText("播放");bt2.setEnabled(false);try{ player.prepare();//为下次播放准备}catch(IllegalStateException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}player.seekTo(0);//定位音乐起始位置}private void init(){player=MediaPlayer.create(this,R.raw.cmsj);bt2.setEnabled(false);} }。
常用的播放器控制代码
<object id="player" height="64" width="260" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6"><param NAME="AutoStart" V ALUE="-1"><!--是否自动播放--><param NAME="Balance" V ALUE="0"><!--调整左右声道平衡,同上面旧播放器代码--><param name="enabled" value="-1"><!--播放器是否可人为控制--><param NAME="EnableContextMenu" V ALUE="-1"><!--是否启用上下文菜单--><param NAME="url" value="/blog/1.wma"><!--播放的文件地址--><param NAME="PlayCount" V ALUE="1"><!--播放次数控制,为整数--><param name="rate" value="1"><!--播放速率控制,1为正常,允许小数,1.0-2.0--><param name="currentPosition" value="0"><!--控件设置:当前位置--><param name="currentMarker" value="0"><!--控件设置:当前标记--><param name="defaultFrame" value=""><!--显示默认框架--><param name="invokeURLs" value="0"><!--脚本命令设置:是否调用URL--><param name="baseURL" value=""><!--脚本命令设置:被调用的URL--><param name="stretchToFit" value="0"><!--是否按比例伸展--><param name="volume" value="50"><!--默认声音大小0%-100%,50则为50%--><param name="mute" value="0"><!--是否静音--><param name="uiMode" value="mini"><!--播放器显示模式:Full显示全部;mini最简化;None不显示播放控制,只显示视频窗口;invisible全部不显示--><param name="windowlessVideo" value="0"><!--如果是0可以允许全屏,否则只能在窗口中查看--><param name="fullScreen" value="0"><!--开始播放是否自动全屏--><param name="enableErrorDialogs" value="-1"><!--是否启用错误提示报告--><param name="SAMIStyle" value><!--SAMI样式--><param name="SAMILang" value><!--SAMI语言--><param name="SAMIFilename" value><!--字幕ID--></object>下面是一些常用的方法和属性://基本属性URL:String; 指定媒体位置,本机或网络地址uiMode:String; 播放器界面模式,可为Full, Mini, None, InvisibleplayState:integer; 播放状态,1=停止,2=暂停,3=播放,6=正在缓冲,9=正在连接,10=准备就绪enableContextMenu:Boolean; 启用/禁用右键菜单(也是简单的防盗链方法)fullScreen:boolean; 是否全屏显示//播放器控制属性controls.play; 播放controls.pause; 暂停controls.stop; 停止controls.currentPosition:double; 当前进度controls.currentPositionString:string; 当前进度,字符串格式。
javplayer原理
javplayer原理JavaPlayer是一个用于在Java应用程序中播放音频和视频文件的工具。
它基于Java Media Framework(JMF)和Java Sound API,并提供了简单易用的接口来实现音视频播放功能。
JavaPlayer的原理主要包括以下几个方面:1. **JMF架构**:Java Media Framework是用于处理音频和视频数据的Java API。
它提供了一组类库和接口,用于实现音视频播放、录制、编辑等功能。
JMF的架构主要包括媒体引擎、媒体处理器和数据源。
媒体引擎负责协调各个组件,媒体处理器用于处理媒体数据,数据源提供媒体数据。
2. **媒体播放**:JavaPlayer通过JMF提供的媒体引擎和媒体处理器来实现媒体文件的播放。
首先,JavaPlayer需要创建一个媒体播放器对象,并指定要播放的媒体文件。
然后,JavaPlayer会使用媒体引擎加载媒体数据,并使用媒体处理器解码和播放媒体数据。
3. **音视频同步**:在播放音视频文件时,JavaPlayer需要确保音频和视频的同步。
这通常通过同步时钟和缓冲区来实现。
JavaPlayer会使用一个时钟对象来跟踪音视频数据的播放进度,并根据时钟来同步音频和视频的播放。
同时,JavaPlayer还会使用缓冲区来处理媒体数据的加载和播放延迟,以确保音视频同步。
4. **事件处理**:JavaPlayer可以通过监听媒体播放器的事件来处理播放过程中的各种情况。
例如,JavaPlayer可以监听媒体播放器的播放完成事件,以便在媒体文件播放完毕时执行相应的操作。
此外,JavaPlayer还可以监听媒体播放器的错误事件,以处理播放过程中可能出现的错误。
总的来说,JavaPlayer的原理是基于JMF的媒体处理和播放机制实现的。
它通过媒体引擎和媒体处理器加载、解码和播放音视频文件,并通过时钟和缓冲区来实现音视频同步和播放控制。
Javaapplet音频播放器
1课题需求分析在Java2平台出现前,Java语言只能处理电话音质的声音,以单声道8KHz的采样频率存储为u-lawAU文件。
Java2平台增加了AIFF、WA V以及三种MIDI文件类型的支持。
所支持的三种MIDI文件格式为MIDI文件类型0、MIDI文件类型1以及RMF。
2课程解决方案本程序有三个文件:SoundApplet.Java是主文件,AppletSoundLoader.Java中的AppletSoundLoader类继承Thrwad负责为声音文件获得AudioClip对象并把它加到AppletSoundList中去;AppletSoundList.java中定义的AppletSoundList继承自Hashtable,提供getClip<String)和putClip(AudioClip,String>方法,分别从哈希表中取得AudioClip 对象和放置AudioClip对象。
其结构是AppletSoundList中用AppletSoundLoader来装载制定URL的声音文件,AppletSoundLoader负责为声音文件产生AudioClip对象并添加到AppletSoundList中。
在SoundApplet中则只是利用AppletSoundList类。
3课题实现主要的声音文件类型如下:AU (扩展名为AU或SND>:适用于短的声音文件,为Solaris和下一代机器的通用文件格式,也是Java平台的标准音频格式。
AU类型文件使用的三种音频格式为:8位u-law类型<通常采用频率为8KHz),8位线性类型以及16位线性类型。
WA V<扩展名为WA V):由Microsoft和IBM共同开发,对WA V的支持已经被加进Windows95并且被延伸到Windows98。
WA V文件能存储各种格式包括u-law、a-law 和PCM<线性)数据。
实现一个简单的音乐播放器程序
实现一个简单的音乐播放器程序随着数字音乐的普及,越来越多的人开始喜欢听音乐,并需要一个好用的音乐播放器来管理和播放音乐。
在本文中,我将介绍如何实现一个简单的音乐播放器程序。
1. 确定需求在开始编写程序之前,我们需要先确定我们的需求。
一个好的音乐播放器应该具备以下基本功能:播放、暂停、停止、上一首、下一首、列表循环、单曲循环、随机播放等。
此外,我们还可以考虑增加一些可选的高级功能,比如音量调节、歌词显示、可视化效果等。
2. 选择编程语言和开发环境选择一种熟悉的编程语言,比如Java、C#、Python等,以及一个好用的集成开发环境,比如Eclipse、vscode、PyCharm等。
在本文中,我选择使用Java语言和Eclipse开发环境。
3. 设计程序架构在开始编写程序之前,我们需要先设计程序的架构。
通常情况下,一个音乐播放器应该包含两个主要的模块:界面模块和播放模块。
其中,界面模块负责展示界面和处理用户输入,播放模块负责播放音乐和控制播放器的行为。
4. 实现界面模块首先,我们需要设计出音乐播放器的界面,并实现对应的界面代码。
在这里,我们可以使用JavaFX框架来实现,它提供了很多常用的UI组件,比如按钮、标签、文本框、进度条等。
同时,JavaFX还提供了FXML文件的支持,可以将UI和后台代码分离,使程序更加清晰易懂。
5. 实现播放模块接下来,我们需要实现播放模块。
通常情况下,我们可以使用Java内置的MediaPlayer类来实现音乐播放功能。
这个类提供了播放、暂停、停止、上一首、下一首、列表循环、单曲循环、随机播放等功能,可以满足我们的大部分需求。
同时,我们还可以通过监听器等方式来实现一些可选的高级功能,比如音量调节、歌词显示、可视化效果等。
6. 调试和优化最后,我们需要进行调试和优化,确保程序能够正常运行,并且没有明显的问题,比如歌曲播放异常、界面卡顿等。
如果有问题,我们需要及时修改代码,并重新测试,直到程序能够正常运行。
头歌云课java实训作业五
头歌云课java实训作业五Java实训作业五:基于头歌云课的音乐播放器概述:在本次实训作业中,我们将使用Java编程语言基于头歌云课平台设计并实现一个简单的音乐播放器。
该音乐播放器能够实现音乐的播放、暂停、停止以及音量的调节等基本功能。
同时,我们还需考虑如何实现音乐列表的管理,能够实现音乐的添加、删除、排序等功能。
一、需求分析:1. 实现基本功能:- 播放音乐:能够选择音乐文件进行播放。
- 暂停音乐:暂停当前正在播放的音乐。
- 停止音乐:停止当前正在播放的音乐。
- 调节音量:能够调节音乐的音量大小。
2. 实现音乐列表管理:- 添加音乐:能够将音乐添加到播放列表中。
- 删除音乐:能够删除播放列表中的音乐。
- 排序音乐:能够根据音乐的名称、歌手、时长等属性对播放列表中的音乐进行排序。
二、概要设计:1. 音乐播放器类:- 属性:音乐列表(List<Music>)、当前播放的音乐(Music)、音量大小(int)。
- 方法:播放音乐、暂停音乐、停止音乐、调节音量等。
2. 音乐类:- 属性:音乐名称(String)、歌手(String)、时长(int)等。
- 方法:获取音乐名称、获取歌手、获取时长等。
3. 音乐列表管理类:- 属性:音乐列表(List<Music>)。
- 方法:添加音乐、删除音乐、排序音乐等。
三、详细设计与实现:1. 音乐播放器类的详细设计:- 属性:- 音乐列表:使用List<Music>类型的对象存储音乐列表。
- 当前播放的音乐:使用Music类型的对象存储当前播放的音乐。
- 音量大小:使用int类型的变量存储音量大小。
- 方法:- 播放音乐:根据传入的音乐名称,从音乐列表中查找对应的音乐并播放。
- 暂停音乐:暂停当前正在播放的音乐。
- 停止音乐:停止当前正在播放的音乐。
- 调节音量:根据传入的音量大小,调节当前音乐的音量。
- 其他辅助方法:例如获取当前播放音乐的名称、获取当前播放音乐的歌手等。
使用Java创建视频播放器
使用Java创建视频播放器-一个实战教程视频播放器是一种常见的应用程序,它允许用户播放本地视频文件或在线视频流。
在这个实战博客中,我们将创建一个简单的Java视频播放器,演示如何使用Java编程语言和Java多媒体库来实现视频播放功能。
以下是本实战博客的主要内容:项目概述准备工作创建Java项目添加多媒体库创建GUI界面播放本地视频播放在线视频总结让我们开始吧!1. 项目概述在本项目中,我们将创建一个Java视频播放器应用程序,它包括以下主要功能:显示视频播放窗口,包括播放、暂停、停止、音量控制和进度条。
允许用户选择本地视频文件并播放。
允许用户输入在线视频的URL并播放。
我们将使用Java编程语言和Java多媒体库来构建这个视频播放器应用程序。
2. 准备工作在开始之前,确保您的开发环境已设置好。
我们将使用Java编程语言和一些开发库来构建视频播放器应用程序,不需要额外的工具或库。
3. 创建Java项目首先,创建一个新的Java项目,您可以使用任何Java集成开发环境(IDE)来完成此操作。
在项目中,我们将创建Java类来实现视频播放器应用程序。
4. 添加多媒体库为了播放视频,我们需要引入一个Java多媒体库。
在本示例中,我们将使用JavaFX,它是Java的官方多媒体库,具有强大的视频播放功能。
请确保您的Java开发环境包含JavaFX库。
大多数现代的Java开发工具都默认包含JavaFX。
如果您不确定是否已包含JavaFX,可以在项目配置中进行检查。
5. 创建GUI界面我们将创建一个简单的Swing GUI界面,用于显示视频播放窗口和控制按钮。
创建一个Java 类,例如VideoPlayerApp,并在其中创建GUI界面。
javaCopy codeimport javafx.embed.swing.JFXPanel;import javafx.scene.media.Media;import javafx.scene.media.MediaPlayer;import javafx.scene.media.MediaView;import javafx.util.Duration;import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;public class VideoPlayerApp {private JFrame frame;private JFXPanel videoPanel;private MediaView mediaView;private MediaPlayer mediaPlayer;private JButton playButton;private JButton pauseButton;private JButton stopButton;private JSlider volumeSlider;private JSlider progressSlider;public VideoPlayerApp() {frame = new JFrame("视频播放器");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(800, 600);frame.setLayout(new BorderLayout());videoPanel = new JFXPanel();frame.add(videoPanel, BorderLayout.CENTER);JPanel controlPanel = new JPanel(new FlowLayout());playButton = new JButton("播放");pauseButton = new JButton("暂停");stopButton = new JButton("停止");volumeSlider = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);progressSlider = new JSlider(JSlider.HORIZONTAL, 0, 100, 0);controlPanel.add(playButton);controlPanel.add(pauseButton);controlPanel.add(stopButton);controlPanel.add(volumeSlider);controlPanel.add(progressSlider);frame.add(controlPanel, BorderLayout.SOUTH);playButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {playVideo();}});pauseButton.addActionListener(new ActionListener() { @Overridepublic void actionPerformed(ActionEvent e) {pauseVideo();}});stopButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {stopVideo();}});volumeSlider.addChangeListener(e -> {adjustVolume(volumeSlider.getValue());});progressSlider.addChangeListener(e -> {seekToProgress(progressSlider.getValue());});frame.setVisible(true);}public static void main(String[] args) {SwingUtilities.invokeLater(() -> new VideoPlayerApp());}private void playVideo() {// 实现播放视频的代码,略...}private void pauseVideo() {// 实现暂停视频的代码,略...}private void stopVideo() {// 实现停止视频的代码,略...}private void adjustVolume(int volume) {// 实现调整音量的代码,略...}private void seekToProgress(int progress) {// 实现跳转进度的代码,略...}}在上述代码中,我们创建了一个VideoPlayerApp类,包括一个Swing窗口和视频播放窗口、控制按钮以及音量和进度条。
音频播放器代码-代码大全
音频播放器代码-代码大全播放器样式和代码1.简易播放器一(手动) 主要音频格式:rm,ra,ram,mp3简易播放器(自动播放)代码,提取方法:右击,全选,复制<center><embed src="音频绝对地址" width=200 height=30 controls=ControlPanel loop=true autostart=true volume=100 type=audio/x-pn-realaudio-plugin Initfn=load-types mime-types=mime.types></center>2.简易播放器二(手动) 主要格式wma,mp3简易播放器二(自动播放)代码.提取方法:右击,全选,复制<center><EMBED style="FILTER: xray(); WIDTH: 200px; HEIGHT: 30px" src="音频绝对地址" type=audio/x-mpegurl volume="0" loop="-1" autostart="true" allowscriptaccess="never"></EMBED></center>3.多功能播放器(手动)各类格式音视频 (rm等除外)多功能播放器(自动播放)代码,提取方法:右击,全选,复制(如果是视频文件,请将以下代码里的值改为height=350)<center><OBJECT id=phx height=45 width=350 classid=clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6><PARAM NAME="URL" VALUE="音视频绝对地址"><PARAM NAME="rate" VALUE="1"><PARAM NAME="balance" VALUE="0"><PARAM NAME="currentPosition" VALUE="0"><PARAM NAME="defaultFrame" VALUE=""><PARAM NAME="playCount" VALUE="1"><PARAM NAME="autoStart" VALUE="-1"><PARAM NAME="currentMarker" VALUE="0"><PARAM NAME="invokeURLs" VALUE="-1"><PARAM NAME="baseURL" VALUE=""><PARAM NAME="volume" VALUE="78"><PARAM NAME="mute" VALUE="0"><PARAM NAME="uiMode"VALUE="full"><PARAM NAME="stretchToFit" VALUE="0"><PARAM NAME="windowlessVideo" VALUE="0"><PARAM NAME="enabled" VALUE="-1"><PARAM NAME="enableContextMenu" VALUE="-1"><PARAM NAME="fullScreen" VALUE="0"><PARAM NAME="SAMIStyle" VALUE=""><PARAM NAME="SAMILang" VALUE=""><PARAM NAME="SAMIFilename" VALUE=""><PARAM NAME="captioningID" VALUE=""><PARAM NAME="enableErrorDialogs" VALUE="0"><PARAM NAME="_cx" VALUE="8811"><PARAM NAME="_cy" VALUE="1217"></OBJECT></CENTER>4.微软简易播放器(手动)音频格式:mp3,wma等微软播放器(自动播放)代码,提取方法:右击,全选,复制<P align=center><EMBED src="音频绝对地址" width=320 height=45 type=audio/mpeg autostart="0"></EMBED></P>5.标签型播放器(手动播放)音频格式 mp3,wma标签型播放器(自动播放)代码:代码提取方法:右击,全选,复制<DIV align=center><EMBED src="音频绝对地址" width=300 height=140 type=audio/x-ms-wma balance="true" showpositioncontrols="true" showtracker="true" showaudiocontrols="true" showcontrols="true" showstatusbar="true" showdisplay="true" displaysize="0" volume="100" autosize="false" autostart="true" animationatstart="false" transparentatstart="true"></div>注:1,以上显示的播放器均设置为手动播放,即:autostart="0".如需自动播放请设置autostart="true".2,以上各播放器代码里均设置为自动播放,即.autostart="true",如需手动播放请设置autostart="0"样式和代码1.简易播放器一(手动) 主要音频格式:rm,ra,ram,mp3简易播放器(自动播放)代码,提取方法:右击,全选,复制<center><embed src="音频绝对地址" width=200 height=30 controls=ControlPanel loop=true autostart=true volume=100 type=audio/x-pn-realaudio-plugin Initfn=load-types mime-types=mime.types></center>2.简易播放器二(手动) 主要格式wma,mp3简易播放器二(自动播放)代码.提取方法:右击,全选,复制<center><EMBED style="FILTER: xray(); WIDTH: 200px; HEIGHT: 30px" src="音频绝对地址" type=audio/x-mpegurl volume="0" loop="-1" autostart="true" allowscriptaccess="never"></EMBED></center>3.多功能播放器(手动)各类格式音视频 (rm等除外)多功能播放器(自动播放)代码,提取方法:右击,全选,复制(如果是视频文件,请将以下代码里的值改为height=350)<center><OBJECT id=phx height=45 width=350 classid=clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6><PARAM NAME="URL" VALUE="音视频绝对地址"><PARAM NAME="rate" VALUE="1"><PARAM NAME="balance" VALUE="0"><PARAM NAME="currentPosition" VALUE="0"><PARAM NAME="defaultFrame" VALUE=""><PARAM NAME="playCount" VALUE="1"><PARAM NAME="autoStart" VALUE="-1"><PARAM NAME="currentMarker" VALUE="0"><PARAM NAME="invokeURLs" VALUE="-1"><PARAM NAME="baseURL" VALUE=""><PARAM NAME="volume" VALUE="78"><PARAM NAME="mute" VALUE="0"><PARAM NAME="uiMode" VALUE="full"><PARAM NAME="stretchToFit" VALUE="0"><PARAM NAME="windowlessVideo"VALUE="0"><PARAM NAME="enabled" VALUE="-1"><PARAM NAME="enableContextMenu" VALUE="-1"><PARAM NAME="fullScreen" VALUE="0"><PARAM NAME="SAMIStyle" VALUE=""><PARAM NAME="SAMILang" VALUE=""><PARAM NAME="SAMIFilename" VALUE=""><PARAM NAME="captioningID" VALUE=""><PARAM NAME="enableErrorDialogs" VALUE="0"><PARAM NAME="_cx" VALUE="8811"><PARAM NAME="_cy" VALUE="1217"></OBJECT></CENTER>4.微软简易播放器(手动)音频格式:mp3,wma等微软播放器(自动播放)代码,提取方法:右击,全选,复制<P align=center><EMBED src="音频绝对地址" width=320 height=45 type=audio/mpeg autostart="0"></EMBED></P>5.标签型播放器(手动播放)音频格式 mp3,wma标签型播放器(自动播放)代码:代码提取方法:右击,全选,复制<DIV align=center><EMBED src="音频绝对地址" width=300 height=140 type=audio/x-ms-wma balance="true" showpositioncontrols="true" showtracker="true" showaudiocontrols="true" showcontrols="true" showstatusbar="true" showdisplay="true" displaysize="0" volume="100" autosize="false" autostart="true" animationatstart="false" transparentatstart="true"></div>注:1,以上显示的播放器均设置为手动播放,即:autostart="0".如需自动播放请设置autostart="true".2,以上各播放器代码里均设置为自动播放,即.autostart="true",如需手动播放请设置autostart="0"。
音频播放器源代码
音频播放器源代码1。
可以自动调节长度的音频播放器EMBED style="FILTER:alpha(opacity=15)"src=音乐地址height=45type=audio/mpeg autostart="true"loop="true"说明:这个播放器可以根据你的页面大小而自动调整大小,放文章处和文章宽度一样,想当首页背景音乐,就放在模块里面,就会变的和你一侧的宽度一样,解决了有的人一侧的播放器显示不完整的问题!再加一款大小正好放在一侧的音频播放器DIV EMBED codeBase=src=音乐地址=65 type=application/x-oleobject flename="mp"autostart="true"loop="true"/EMBED/DIV代码说明:AUTOSTART="TRUE"这里TRUE代表自动播放,如果换成FALSE则代表手动播放2。
几种简单的音频播放器代码代码一:embed src="背景音乐网址"hidden="true"autostart="true"loop="true"说明:hidden="true"隐藏播放不显示播放器的外观hidden="false"显示播放height="高度值"width="宽度值"。
autostart="true"当前页一载入则自动播放autostart="false"当前页一载入点击播放loop="true"无限次循环播放loop="false"就播放一次代码二:embed src="背景音乐网址"autostart="true"loop="-1"controls="ControlPanel"height="0"说明:不管是否最小化窗口都始终播放,直至关闭当前窗口为止loop="-1"无限次循环播放loop="1"播放一次改成1两次改成2依次类推width="0"height="0"隐藏播放width="123"height="100"外观大小,可自行调整自动播放无限次的播放器代码:embed autostart="true"loop="-1"controls="ControlPanel"height="0"src="音乐地址";播放一遍需要手动打开的音乐播放代码:/textarea embed src=音乐地址=2 autostart=False loop=False循环播放的音乐播放代码/textarea embed src=音乐地址=2 autostart=True loop=False循环播放+自动音乐播放代码/textarea embed src=音乐地址=2 autostart=True loop=True循环播放+自动音乐播放+隐藏播放器代码/textarea embed src=音乐地址=0 autostart=True loop=True自动音乐播放代码/textarea embed src=音乐地址=2 autostart=False loop=True隐藏播放器代码/textarea embed src=音乐地址=0 autostart=False loop=False循环播放+自动播放+播放器代码img src=":document.getElementById('Mlogo').innerHTML+='divstyle=\'position:absolute;top:;left:;\'iFRAME name=I1 src=\'音乐地址\'frameBorder=\'0\'width=\'\'scrolling=\'no\'height=\'\'/div';"几款播放器与播放器的美化EMBED src="歌曲地址"=50 type=audio/mpeg loop="-1"autostart="FALSE"volume="0"EMBED style="FILTER:invert()"src="歌曲地址"=50 type=audio/mpeg volume="0"autostart="FALSE"loop="true"EMBED style="FILTER:Xray"src=歌曲地址=05 type=audio/mpeg loop="-1"autostart="FALSE"volume="0"EMBED style="FILTER:GRAY()"src="歌曲地址"=45 type=audio/mpeg loop="-1"autostart="FALSE"volume="0"装饰美化你的播放器有了基本的款式后,我们就可以根据自己的想象力,巧用HTML的表格,根据自己的图片素材,装饰美化自己的播放器啦。
mediaplayer使用方法
mediaplayer使用方法MediaPlayer是一款由Android提供的多媒体播放器,它可以用于播放各种类型的音频和视频文件,包括本地文件和网络文件。
它使用简单,操作方便,并具有多种自定义功能,可以满足不同用户的需求。
本文将介绍如何使用MediaPlayer进行音频和视频播放以及如何使用其它功能。
一、音频播放1.1 播放本地音频文件MediaPlayer可以很容易地播放本地音频文件,只需指定音频文件的路径即可。
以下是最简单的示例代码:```javaMediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.music);mediaPlayer.start();```其中,this代表当前的活动,R.raw.music是音频文件的资源ID。
MediaPlayer支持多种音频文件格式,如mp3、wav等格式。
需要注意的是,播放网络音频文件需要设置音频流类型,上述代码设置为STREAM_MUSIC,表示使用音乐流类型。
如果需要播放其它类型的音频流,可以根据需要修改。
```javaMediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.video);mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mp.start();}});```其中,this代表当前的活动,R.raw.video是视频文件的资源ID。
当MediaPlayer准备好视频后,执行设置的回调函数onPrepared,此时开始播放视频。
需要注意的是,视频播放需要在SurfaceView或TextureView中展示,不能直接在界面上展示。
JavaCV学习(二):使用JavaCV+FFmpeg制作拉流播放器
JavaCV学习(⼆):使⽤JavaCV+FFmpeg制作拉流播放器⼀、前⾔ 在中,我们不断的学习和了解⾳视频相关的知识,随着知识点不断的学习,我们现在应该做的事情,就是将知识点不断的串联起来。
这样才能得到更深层次的领悟。
通过整理我们知道可以使⽤ImageView和SurfaceView甚⾄是View来展⽰图⽚,通过整理我们知道如何播放⾳频原始数据了。
那么可不可以定义为,我们找到了如何播放⾳视频的最基本的⽅式呢?答,当然是的!在⾥,我们接触了⼀次JavaCV,发现⾥⾯提供的API相当丰富,尤其是图形图像处理⽅⾯,那么下⾯我们就基于JavaCV加上它提供的ffmpegAPi⼯具,来完成⼀个基本的拉流播放器的制作,鉴于起名很难,我们先把名字起好:NBPlayer。
⼆、设计⽅案我们要做的是⼀个简单的拉流播放器,需要具备以下功能:1. 将直播流拉取到设备上并展现出来;2. 保证播放当前直播流的⾳视频是同步的;3. 播放视频时可以切换全屏幕与⾮全屏;三、定义播放器的⽣命周期在定义播放器的⽣命周期们需要做到以下两步:1. 先定义⼀下播放器的事件 2. 定义播放器展⽰的控件1. 定义播放器事件因为我们要做的就是⼀个播放器,所以就需要定义出来相应的播放器的事件,最基本的播放器的操作就是:播放、暂停、停⽌。
⽰例代码如下:/*** 播放器抽象类*/public abstract class Player {protected boolean play = false;public void play() {this.play = true;}public void pause() {this.play = false;}public void stop() {this.play = false;}}2. 定义播放器展⽰的控件 - SurfaceView为什么定义完播放器的操作事件之后,就去定义播放器展⽰的控件呢?答:主要是因为我们做的播放器在展⽰控件⽅⾯的思路上和Android原⽣的MediaPlayer及Ijkplayer是⼀样的,都是监听Surface的状态来控制播放器什么时候创建,什么时候暂停,什么时候停⽌并release。
基于Java的音乐播放器的设计与实现
基于Java的音乐播放器的设计与实现介绍本文档旨在介绍基于Java的音乐播放器的设计与实现。
音乐播放器是一种常见的应用程序,它能够播放音频文件,并提供一系列基本的播放控制功能。
功能以下是基于Java的音乐播放器的主要功能:1. 播放和暂停:用户可以选择要播放的音乐文件,并进行播放和暂停操作。
2. 播放列表:用户可以创建和管理播放列表,以便更方便地组织音乐文件。
3. 选择曲目:用户可以通过界面选择要播放的曲目,或者通过搜索功能查找特定的曲目。
4. 快进和倒退:用户可以通过拖动进度条来快进或倒退音乐的播放位置。
5. 音量控制:用户可以通过滑动音量条来调整音乐的音量大小。
6. 重复和随机播放:用户可以选择是否要重复播放当前曲目或随机播放曲目列表中的音乐。
7. 歌词显示:如果音乐文件包含歌词信息,用户可以选择显示歌词以及歌词滚动展示功能。
设计与实现以下是基于Java的音乐播放器的设计与实现的主要步骤:1. 界面设计:设计一个用户友好的界面,包括播放控制按钮、播放列表、歌曲选择界面等。
2. 音频处理:使用Java提供的音频处理库,实现音频文件的解码和播放功能。
3. 播放逻辑:实现播放器的核心逻辑,包括播放、暂停、停止、快进/倒退等操作。
4. 播放列表管理:实现播放列表的创建、添加音乐、删除音乐等功能。
5. 用户交互:为用户提供直观的交互方式,包括点击按钮、拖动进度条等。
总结通过本文档的介绍,我们了解了基于Java的音乐播放器的设计与实现。
基于Java的音乐播放器可以为用户提供丰富的音乐播放功能,并通过友好的界面与用户进行交互。
设计和实现一个功能完善的音乐播放器需要综合考虑音频处理、播放逻辑、播放列表管理和用户交互等方面的因素。
java视频播放器几种
java视频播放器几种package com.bird.jmf;import java.awt.*;import java.awt.event.*;import java.io.*;import /doc/0912398320.html,.*;import javax.swing.*;import javax.media.*;// 视频播放程序public class VideoPlayDemo extends JFrame {private Player player; // 播放器对象private Component visualMedia; // 视频显示组件private Component mediaControl; // 视频播放控制组件private Container container; // 主容器private File mediaFile; //媒体文件private URL fileURL; //媒体文件URL地址public VideoPlayDemo() { // 构造函数super("视频播放程序"); //调用父类构造函数container = getContentPane(); //得到窗口容器JToolBar toobar = new JToolBar(); //实例化工具栏JButton openFile = new JButton("打开媒体文件"); //实例化按钮toobar.add(openFile); //增加按钮到工具栏JButton openURL = new JButton("打开网络地址");toobar.add(openURL);container.add(toobar, BorderLayout.NORTH); //设置工具栏openFile.addActionListener(new ActionListener() { //打开文件按钮事件处理public void actionPerformed(ActionEvent event) {JFileChooser fileChooser = new JFileChooser(); //实例化文件选择器fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); //设置文件打开模式为仅打开文件int result =fileChooser.showOpenDialog(VideoPlayDemo.this);//显示对话框if (result == JFileChooser.APPROVE_OPTION) { //得到用户行为mediaFile = fileChooser.getSelectedFile(); //得到选择的文件}if (mediaFile != null) {try {fileURL = mediaFile.toURL(); //得到文件的URL地址} catch (MalformedURLException ex) {ex.printStackTrace(); //输出错误信息showMessage("打开错误"); //显示错误信息}startPlayer(fileURL.toString()); //开始播放打开的文件 }}});openURL.addActionListener(new ActionListener() { //打开URL按钮事件处理public void actionPerformed(ActionEvent event) {String addressName=JOptionPane.showInputDialog(VideoPlayDemo.this, "输入URL地址");if (addressName != null)startPlayer(addressName); //开始播放打开的URL}});Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, Boolean.TRUE);setSize(300, 200); //设置窗口大小setVisible(true); //设置窗口为可视setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序}//初始化播放器public void startPlayer(String mediaLocation) {if (player != null)//如果播放器非空则移去先前的播放器组件if (visualMedia != null)container.remove(visualMedia); //如果对象visualMedia非空则移去if (mediaControl != null) {container.remove(mediaControl); //如果对象mediaControl非空则移去player.close(); //关闭播放器}MediaLocator mediaLocator = new MediaLocator(mediaLocation); //媒体定位器if (mediaLocator == null) {showMessage("打开文件错误"); //显示错误信息return;}try {player = Manager.createPlayer(mediaLocator); //得到播放器实例player.addControllerListener(new PlayerEventHandler()); //增加播放控制器player.realize();} catch (Exception ex) {ex.printStackTrace();showMessage("打开错误"); //显示错误信息}}//取得媒体组件//Download by /doc/0912398320.html,public void getMediaComponents() {visualMedia = player.getVisualComponent(); //取得视频显示组件//如果对象visualMedia非空则加入到窗口内容窗格if (visualMedia != null) {container.add(visualMedia, BorderLayout.CENTER);pack();}mediaControl = player.getControlPanelComponent(); //取得播放控制组件//如果对象visualMedia非空则加入到窗口内容窗格if (mediaControl != null)container.add(mediaControl, BorderLayout.SOUTH);}//播放器事件处理private class PlayerEventHandler extends ControllerAdapter {public void realizeComplete(RealizeCompleteEvent realizeDoneEvent) {player.prefetch(); //预取媒体数据}//完成预取媒体数据后,开始播放媒体public void prefetchComplete(PrefetchCompleteEvent prefetchDoneEvent) {getMediaComponents();validate();player.start(); //开始播放媒体}//如果媒体播放完毕,重新设置媒体时间并停止媒体播放器public void endOfMedia(EndOfMediaEvent mediaEndEvent) { player.setMediaTime(new Time(0)); //重新设置媒体时间player.stop(); // 停止媒体播放}}public void showMessage(String s) {JOptionPane.showMessageDialog(this, s); //显示提示信息}public static void main(String args[]) {new VideoPlayDemo();}}第二个源码事例import java.awt.BorderLayout;import /doc/0912398320.html,ponent;import java.awt.FileDialog;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.media.ControllerClosedEvent;import javax.media.ControllerEvent;import javax.media.ControllerListener;import javax.media.EndOfMediaEvent;import javax.media.Manager;import javax.media.MediaLocator;import javax.media.NoPlayerException;import javax.media.Player;import javax.media.PrefetchCompleteEvent;import javax.media.RealizeCompleteEvent;import javax.media.Time;import javax.swing.JCheckBoxMenuItem;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.SwingUtilities;import javax.swing.UIManager;public class JMFMediaPlayer extends JFrame implements ActionListener, ControllerListener, ItemListener {// JMF的播放器Player player;// 播放器的视频组件和控制组件Component vedioComponent;Component controlComponent;// 标示是否是第一次打开播放器boolean first = true;// 标示是否需要循环boolean loop = false;// 文件当前目录String currentDirectory;// 构造方法public JMFMediaPlayer(String title) {super(title);addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){// 用户点击窗口系统菜单的关闭按钮// 调用dispose以执行windowCloseddispose();}public void windowClosed(WindowEvent e){if (player != null){// 关闭JMF播放器对象player.close();}System.exit(0);}});// 创建播放器的菜单JMenu fileMenu = new JMenu("文件");JMenuItem openMemuItem = new JMenuItem("打开"); openMemuItem.addActionListener(this);fileMenu.add(openMemuItem);// 添加一个分割条fileMenu.addSeparator();// 创建一个复选框菜单项JCheckBoxMenuItem loopMenuItem = new JCheckBoxMenuItem("循环", false); loopMenuItem.addItemListener(this);fileMenu.add(loopMenuItem);fileMenu.addSeparator();JMenuItem exitMemuItem = new JMenuItem("退出");exitMemuItem.addActionListener(this);fileMenu.add(exitMemuItem);JMenuBar menuBar = new JMenuBar();menuBar.add(fileMenu);this.setJMenuBar(menuBar);this.setSize(200, 200);try {// 设置界面的外观,为系统外观UIManager.setLookAndFeel(UIManager.getSystemLookAndF eelClassName()); SwingUtilities.updateComponentTreeUI(this);} catch (Exception e) {e.printStackTrace();}this.setVisible(true);}/*** 实现了ActionListener接口,处理组件的活动事件*/public void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals("退出")) {// 调用dispose以便执行windowCloseddispose();return;}FileDialog fileDialog = new FileDialog(this, "打开媒体文件", FileDialog.LOAD); fileDialog.setDirectory(currentDirectory);fileDialog.setVisible(true);// 如果用户放弃选择文件,则返回if (fileDialog.getFile() == null){return;}currentDirectory = fileDialog.getDirectory();if (player != null){// 关闭已经存在JMF播放器对象player.close();}try {// 创建一个打开选择文件的播放器player = Manager.createPlayer(new MediaLocator("file:" + fileDialog.getDirectory() + fileDialog.getFile()));} catch (java.io.IOException e2) {System.out.println(e2);return;} catch (NoPlayerException e2) {System.out.println("不能找到播放器.");return;}if (player == null) {System.out.println("无法创建播放器.");return;}first = false;this.setTitle(fileDialog.getFile());// 播放器的控制事件处理player.addControllerListener(this);// 预读文件内容player.prefetch();}/*** 实现ControllerListener接口的方法,处理播放器的控制事件*/ public void controllerUpdate(ControllerEvent e) {// 调用player.close()时ControllerClosedEvent事件出现。
Java实现音频播放--JavaSound API编写音频处理程序
一、JavaSound的体系结构二、JavaSound混频原理三、音频数据与存储格式四、设计音乐播放器五、播放音乐六、支持更多的音频格式━━━━━━━━━━━━━桌面PC的性能日益提高,Java虚拟机的优化技术也不断获得突破,这一切使得用Java处理实时信号成为可能。
本文将通过设计和构造一个支持实时MP3、WAV和Ogg音频格式解码/回放的Java音乐播放器,阐述用JavaSound API编写音频处理程序的思路和一般过程。
JavaSound是一个小巧的低层API,支持数字音频和MIDI数据的记录/回放。
在JDK 1。
3。
0之前,JavaSound是一个标准的Java扩展API,但从Java 2的1.3。
0版开始,JavaSound就被包含到JDK之中。
由于Java有着跨平台(操作系统、硬件平台)的特点,基于JavaSound的音频处理程序(包括本文的程序)能够在任何实现了Java 1。
3+的系统上运行,无需加装任何支持软件。
一、JavaSound的体系结构当前JDK的JavaSound API随同Java媒体框架(JMF,Java Media Framework)一起发布,主页在java。
sun。
com/products/java—media/jmf/,适合JDK 1。
1以及更高的版本。
除了JDK实现的JavaSound API之外,还有一个源代码开放的JavaSound实现是Tritonus,主页在http://www。
tritonus。
org/。
图一描述了JavaSound API的体系结构,虚线表示Sun的JavaSound标准定义的API调用。
上面一根虚线表示我们编写音频处理程序要调用的API,JavaSound API包含在javax。
sound.sampled和javax。
sound.midi包中。
两根虚线之间的部分就是JavaSound API的具体实现.图一:JavaSound体系结构就象上面一根虚线表示的API具有统一标准一样,在所有的JavaSound实现中,图一下面一根虚线表示的SPI(服务提供者接口, Service Provider Interface)也是统一的。
用jfm视频播放的源文件
第一步:我用的是MyEclipse 5.5。
所以,先建立一个class文件,名字:MediaPlayer.java 完整代码如下:import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.media.*;import java.io.*;import java.util.*;//为了导入Vectorpublic class MediaPlayer extends JFrame implements ActionListener,Runnable{private JMenuBar bar;//菜单条private JMenu fileMenu,choiceMenu,aboutMenu;private JMenuItem openItem,openDirItem,closeItem,about,infor;private JCheckBoxMenuItem onTop;private boolean top=false,loop;//设定窗口是否在最前面private Player player;//Play是个实现Controller的接口private File file,listFile;//利用File类结合JFileChooser进行文件打开操作,后则与list.ini有关private Container c;//private UIManager.LookAndFeelInfo[] look;private String title,listIniAddress;//标题private FileDialog fd;private JPanel panel,panelSouth;private Icon icon; //开始进入的时候要显示的图标,它为抽象类,不能自己创建private JLabel//listB=new JLabel(new ImageIcon("qingdan.gif"),SwingConstants.CENTER);scroll=new JScrollPane(list);//用于存放播放列表//dialog2=new JDialogTest(MediaPlayer.this,"播放清单",scroll);//dialog2.setVisible(true);readToList.start();//启动先程,加载播放列表try{Thread.sleep(10);}catch(InterruptedException e){e.printStackTrace();}/*look=UIManager.getInstalledLookAndFeels();try{UIManager.setLookAndFeel(look[2].getClassName());SwingUtilities.updateComponentTreeUI(this);}catch(Exception e){e.printStackTrace();}*///与下面的代码实现相同的功能,但执行速度要慢,原因:明显转了个大弯/*try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch(Exception e){e.printStackTrace();} *///此段代码使执行速度大大降低bar=new JMenuBar();setJMenuBar(bar);//此两行创建菜单栏并放到此窗口程序//bar.setBackground(new Color(48,91,183));fileMenu=new JMenu("文件");bar.add(fileMenu);choiceMenu=new JMenu("控制");bar.add(choiceMenu);aboutMenu=new JMenu("帮助");bar.add(aboutMenu);openItem =new JMenuItem("打开文件");openDirItem =new JMenuItem("打开目录");closeItem =new JMenuItem("退出程序");openItem.addActionListener(this);openDirItem.addActionListener(this);closeItem.addActionListener(this);fileMenu.add(openItem);fileMenu.add(openDirItem);fileMenu.add(closeItem);onTop=new JCheckBoxMenuItem("播放时位于最前面",top); choiceMenu.add(onTop);onTop.addItemListener(new ItemListener(){public void itemStateChanged(ItemEvent e){if(onTop.isSelected())top=true;else top=false;setAlwaysOnTop(top);}});choiceMenu.addSeparator();//加分割符号buttonGroup=new ButtonGroup();buttonValues=new JRadioButtonMenuItem[3];for(int bt=0;bt<3;bt++){buttonValues[bt]=new JRadioButtonMenuItem(content[bt]); buttonGroup.add(buttonValues[bt]);choiceMenu.add(buttonValues[bt]);}buttonValues[0].setSelected(true);choiceMenu.addSeparator();/*loopItem=new JCheckBoxMenuItem("是否循环");choiceMenu.add(loopItem);loopItem.addItemListener(new ItemListener(){public void itemStateChanged(ItemEvent e){loop=!loop;}});*/infor=new JMenuItem("软件简介");aboutMenu.add(infor);infor.addActionListener(this);about=new JMenuItem("关于作者");about.addActionListener(this);aboutMenu.add(about);//菜单栏设置完毕panel=new JPanel();panel.setLayout(new BorderLayout());c.add(panel,BorderLayout.CENTER);panelSouth=new JPanel();panelSouth.setLayout(new BorderLayout());c.add(panelSouth,BorderLayout.SOUTH);icon=new ImageIcon("icon\\Player.jpg");label=new JLabel(icon);panel.add(label);popupMenu=new JPopupMenu();del =new JMenuItem("删除");//鼠标右键弹出菜单对象实例化popupMenu.add(del);del.addActionListener(this);delAll =new JMenuItem("全部删除");popupMenu.add(delAll);delAll.addActionListener(this);reName =new JMenuItem("重命名");popupMenu.add(reName);reName.addActionListener(this);scroll=new JScrollPane(list);//用于存放播放列表listB=new JLabel(new ImageIcon("icon\\qingdan.gif"),SwingConstants.CENTER);panelSouth.add(listB,BorderLayout.NORTH);panelSouth.add(scroll,BorderLayout.CENTER);dialog1=new DialogDemo(MediaPlayer.this,"软件说明");this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);//设定窗口关闭方式//this.setTitle("d");编译通过,说明可以再次设定标题this.setLocation(400,250);//设定窗口出现的位置//this.setSize(350,320);//窗口大小setSize(350,330);this.setResizable(false);//设置播放器不能随便调大小this.setVisible(true);//此句不可少,否则窗口会不显示}public void actionPerformed(ActionEvent e){if(e.getSource()==openItem)//getSource()判断发生时间的组键{//System.out.println("d");测试用openFile();//createPlayer();//setTitle(title);}if(e.getSource()==openDirItem)//打开目录{openDir();if(e.getSource()==closeItem)//推出播放器{exity_n();//System.exit(0);}if(e.getSource()==about){JOptionPane.showMessageDialog(this,"此简易播放器由计科0302\n"+"harly\n "+" 完成 ","参与者",RMATION_MESSAGE);}if(e.getSource()==del){//index//delPaintList(index);fileName.removeElementAt(indexForDel);dirName.removeElementAt(indexForDel);numList.removeAllElements();//从三个容器里面移除此项Enumeration enumFile=fileName.elements();while(enumFile.hasMoreElements()){numList.addElement((numList.size()+1)+"."+enumFile.nextElement()); //numList添加元素,显示播放里表中}//list.setListData(fileName);list.setListData(numList);if(index<indexForDel)list.setSelectedValue(numList.elementAt(index),true);else{if(index==indexForDel);elseif(index!=0)list.setSelectedValue(numList.elementAt(index-1),true);}//list.setSelectedIndex(index);}if(e.getSource()==delAll)//全部删除{fileName.removeAllElements();dirName.removeAllElements();numList.removeAllElements();list.setListData(numList);}if(e.getSource()==reName)//重命名{String name;//=JOptionPane.showInputDialog(this,"请输入新的名字");try{name=reNames();fileName.setElementAt(name,indexForDel);numList.setElementAt((indexForDel+1)+"."+name,indexForDel);}catch(ReName e2)//自定义的异常{}}if(e.getSource()==infor){dialog1.setVisible(true);}}public static void main(String[] args){final MediaPlayer mp=new MediaPlayer();mp.setIconImage(new ImageIcon("icon\\mPlayer.jpg").getImage());//改变默认图标mp.addWindowListener(new WindowAdapter()//注册窗口事件{public void windowClosing(WindowEvent e){//System.exit(0);mp.exity_n();}});System.out.println("注意:更新文件列表后,请先正常关闭播放器"+"\n然后再关闭此DOS窗口,否则导致播放列表不能保存!!");}private void openFile()//为了界面原因,此代码重写,估计兼容性不好了{/*JFileChooser fileChooser=new JFileChooser();//文件选择器fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//可以选择文件不能目录int result=fileChooser.showOpenDialog(this);//创建文件打开对话框,并设定此程序为父窗口监控*//*通过result的值来判断文件是否打开成功*JFileChooser类有很多静态成员变量**//*if(result==JFileChooser.CANCEL_OPTION){file=null;//file已经在类中定义,如果选择取消,file指向为空}else{file=fileChooser.getSelectedFile();//获得文件对象title=file.getAbsolutePath();//取得文件的绝对路径并且赋给title设定标题}*///if(fd==null)//{//String filename="java音频播放器";fd = new FileDialog(MediaPlayer.this);//Filters fl=new Filters();//fd.setFilenameFilter(fl);fd.setVisible(true);if (fd.getFile() != null){title = fd.getDirectory() + fd.getFile();//原因请见同目录下的FileDialogDemo.java文件files=fd.getFile();//dir =fd.getDirectory();file=new File(title);createPlayer();}//title=filename;//fd=null;//缺少此句如果第一次打开文件的时候取消操作的时候第二次也不能打开文件了//}}private void openDir(){JFileChooser fileChooser=new JFileChooser();fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);int result=fileChooser.showOpenDialog(MediaPlayer.this);if(result==JFileChooser.CANCEL_OPTION)return;file=fileChooser.getSelectedFile();if(file==null||file.getName().equals(""))JOptionPane.showMessageDialog(this,"错误的路径","出错了",JOptionPane.ERROR_MESSAGE);String[] sFiles=file.list();for(int i=0;i<sFiles.length;i++){fileName.addElement(sFiles[i]);numList.addElement((numList.size()+1)+"."+sFiles[i]);dirName.addElement(file.getAbsolutePath()+"\\"+sFiles[i]);}list.setListData(numList);/*fd=new FileDialog(MediaPlayer.this);fd.setVisible(true);if(fd.getDirectory()!=null){File fileDir=new File(fd.getDirectory());String[] ss=fileDir.list();for(int i=0;i<ss.length;i++){System.out.println(ss[i]);}}*/}private void createPlayer(){closePreviosPlayer();//关闭先前的媒体播放器String extendName="此播放器好象不支持"+title.substring(stIndexOf(".")+1)+"格式";try{player=Manager.createPlayer(file.toURL());//javax.media.Manager直接继承于ng.object,且它为final,不能被继承player.addControllerListener(new ControllerHand());player.start();addList(files);index=fileName.size()-1;list.setSelectedValue(numList.elementAt(index),true);//list.setSelectedIndex(index);//list.setSelectionForeground(Color.blue);setTitle(title);//addList("files");//到播放清单//title="file.getAbsoluteFile()";}catch(Exception e){JOptionPane.showMessageDialog(this,extendName,"出错了!!",JOptionPane.ERROR_MESSAGE);setTitle(extendName);}}private void closePreviosPlayer(){if(player==null)return;//player.close();//首先停止播放/**不能用上面的代码停止,要用下面的两行取代,否则Component visual =player.getVisualComponent();发生异常**/player.stop();player.deallocate(); //停止播放并且重新装载DateSourceComponent visual =player.getVisualComponent();Component control=player.getControlPanelComponent();if(visual!=null){panel.remove(visual);}if(control!=null){panel.remove(control);}}private class ControllerHand implements ControllerListener {public void controllerUpdate(ControllerEvent e){if(e instanceof RealizeCompleteEvent){Component visual=player.getVisualComponent();if(visual!=null){//System.out.println("音频播放器不支持视频图象功能"); //setTitle("音频播放器不支持视频图象功能");panel.removeAll();panel.add(visual,BorderLayout.CENTER);}else{panel.add(label,BorderLayout.CENTER);}///此else语句可以防止因为原来播放视频图象后以后没有界面 Component control=player.getControlPanelComponent();if(control!=null){panel.add(control,BorderLayout.SOUTH);}//c.validate();panel.doLayout();return;}if (e instanceof EndOfMediaEvent){/*if (loop){player.setMediaTime (new Time (0));player.start ();}return;*/if(buttonValues[0].isSelected()){if(fileName.size()==0)return;index=(int)(Math.random()*fileName.size());}if(buttonValues[1].isSelected()){if(fileName.size()==0)return;//必须有此if语句,否则当用户把播放列表清空的时候发生异常,偶然的机会发现的//现在感觉测试软件真是太重要了,看来以后程序做好后要反复测试,考虑各种情况index=(index+1)%fileName.size();}if(buttonValues[2].isSelected()){player.setMediaTime (new Time (0));player.start();}createPlayer2();}}}private void exity_n(){/*int exi;exi=JOptionPane.showConfirmDialog(this,"真的要离开么?","退出程序",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);//if(exi==null)if(exi==JOptionPane.YES_OPTION){saveList();System.exit(0);}return;*/saveList();System.exit(0);}private void addList(String vf){//fileReadList=new fileReadList(fdd,)//try//{//int i=0;//fileName.addElement((fileName.size()+1)+"."+vf);fileName.addElement(vf);numList.addElement((numList.size()+1)+"."+vf);//fileName.addElement(++i+"."+vf);dirName.addElement(title);list.setListData(numList);//}/*catch(Exception e){e.printStackTrace();//System.out.println(e.getMessage());}*/}private void createPlayer2(){try{title=dirName.elementAt(index).toString();}//title=dirName.elementAt(index).toString();catch(ArrayIndexOutOfBoundsException e){return;}file=new File(title);closePreviosPlayer();//关闭先前的媒体播放器String extendName="此播放器好象不支持"+title.substring(stIndexOf(".")+1)+"格式";try{player=Manager.createPlayer(file.toURL());//javax.media.Manager直接继承于ng.object,且它为final,不能被继承player.addControllerListener(new ControllerHand());player.start();//list.setSelectedIndex(index);list.setSelectedValue(numList.elementAt(index),true);//list.setSelectionForeground(Color.blue);//list.setSelectedIndex(index);//addList(files);setTitle(title);//addList("files");//到播放清单}catch(Exception e){//JOptionPane.showMessageDialog(this,extendName,"出错了!!",JOptionPane.ERROR_MESSAGE);//setTitle(extendName);String ex=null;try{ex=fileName.elementAt(index).toString();}catch(Exception e1){return;}fileName.removeElementAt(index);numList.removeAllElements();Enumeration enumFile=fileName.elements();while(enumFile.hasMoreElements()){numList.addElement((numList.size()+1)+"."+enumFile.nextElement()); }dirName.removeElementAt(index);//list.setListData(fileName);list.setListData(numList);System.out.println("已经从播放列表中删除 "+"\""+ex+"\""+" 文件,"+"因为此播放器不支持"+ex.substring(stIndexOf(".")+1)+"格式," +"不过没有从硬盘真正删除");if(numList.size()!=0){index%=numList.size();createPlayer2();}}}private void saveList(){Enumeration enumFile=fileName.elements();Enumeration enumDir =dirName.elements();try{output=new ObjectOutputStream(new BufferedOutputStream(newFileOutputStream(listFile)));while(enumFile.hasMoreElements()){listWriteFile=newListValues(enumFile.nextElement().toString(),enumDir.nextElement().toString());output.writeObject(listWriteFile);}output.flush();output.close();}catch(Exception e){e.printStackTrace();}/*finally{output.flush();output.close();//郁闷,这两行不能写在这里,实在是一大遗憾啊,不知道有什么别的方法}*/}public void run(){try{Thread.sleep(1);}catch(InterruptedException e){}try{if(!listFile.exists()){listFile.createNewFile();//防止不存在此文件发生读取错误,这两行代码保证不存在的情况下自动建立return;}input=new ObjectInputStream(new BufferedInputStream(newFileInputStream(listFile)));while(true){listWriteFile=(ListValues)input.readObject();fileName.addElement(listWriteFile.getFileName());numList.addElement((numList.size()+1)+"."+listWriteFile.getFileName()); dirName.addElement(listWriteFile.getDirName());}}catch(EOFException e){try{//if(!fileName.isEmpty())input.close();//确认有元素存在并加载完毕后关闭输入流}catch(IOException e1){JOptionPane.showMessageDialog(MediaPlayer.this,"文件被非正常关闭","非法关闭",JOptionPane.ERROR_MESSAGE);}}catch(ClassNotFoundException e){JOptionPane.showMessageDialog(MediaPlayer.this,"不能创建对象","对象创建失败",JOptionPane.ERROR_MESSAGE);}catch(IOException e){JOptionPane.showMessageDialog(MediaPlayer.this,"不能读取文件","读取文件失败",JOptionPane.ERROR_MESSAGE);}finally{try{if(input!=null)input.close();}catch(IOException e){}if(dirName.isEmpty())//防止Vector越界{return;}index=(int)(Math.random()*(fileName.size()));//产生随即数,进行随即播放list.setListData(numList);//list.setListData(fileName);//list.setSelectedValue(fileName.elementAt(index),true);//list.ensureIndexIsVisible(index);//确保选择项可以看见//list.setSelectionForeground(Color.green);createPlayer2();}}private void checkMenu(MouseEvent e){if(e.isPopupTrigger()){indexForDel=list.locationToIndex(e.getPoint());int[] selected={index,indexForDel};//Point p=new Point(e.getX(),e.getY());list.setSelectedIndices(selected);popupMenu.show(list,e.getX(),e.getY());}//list.setSelectedIndex(index);}String reNames() throws ReName//文件该名函数{String name=JOptionPane.showInputDialog(this,"请输入新的名字",fileName.elementAt(indexForDel));if(name==null||name.equals("")) throw new ReName();//必须把name==null放在前面,否则会发生NullPointerExceptin,这个很好理解,//当我们按了取消后,name会成为空,那么name.equals("")就会发生异常return name;}class ReName extends Exception//自定义异常来处理文件该名的时候发生输入为空的情形{}/*class Filters implements FilenameFilter{public boolean accept(File dir,String name) {return (name.endsWith(".exe"));}}*/}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//程序所用到的各种程序包import java.awt.BorderLayout;import java.awt.CheckboxMenuItem; import java.awt.Color;import ponent;import java.awt.Container;import java.awt.FileDialog;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Menu;import java.awt.MenuBar;import java.awt.MenuItem;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;import javax.media.ControllerClosedEvent;import javax.media.ControllerEvent;import javax.media.ControllerListener;import javax.media.EndOfMediaEvent;import javax.media.GainControl;import javax.media.Manager;import javax.media.MediaLocator;import javax.media.NoPlayerException;import javax.media.Player;import javax.media.PrefetchCompleteEvent;import javax.media.RealizeCompleteEvent;import javax.media.Time;import javax.swing.JFrame;//本程序对应的类;class MediaPlayerextends JFrameimplements ActionListener, ControllerListener, ItemListener { //MediaPlayer类的变量成员的声明;//JMF提供的播放器对象;Player player;Component vc, cc, gcc;GainControl gc;boolean first = true, loop = false;//设立一个字符串记录当前打开文件的路径String currentDirectory;MediaPlayer(String title {super(title;// 利用一个 adapter 实现对用户点击窗口系统菜单的关闭按钮 // 时的响应; addWindowListener(new WindowAdapter( {public void windowClosing(WindowEvent e {//调用 dispose 以执行 windowCloseddispose(;}public void windowClosed(WindowEvent e {if (player != nullplayer.close(;System.exit(0;}};//调用设置程序菜单栏的方法成员完成菜单的布置setupMenu(;setSize(400, 400;setVisible(true;}//本方法用以设置程序菜单栏public void setupMenu( {//设置一个菜单Menu f = new Menu("文件 ";//往设置的菜单种添加菜单项MenuItem mi = new MenuItem("打开 ";mi.addActionListener(this;f.add(mi;f.addSeparator(;CheckboxMenuItem cbmi = new CheckboxMenuItem("循环 ", false; cbmi.addItemListener(this;f.addSeparator(;mi = new MenuItem("退出 ";mi.addActionListener(this;f.add(mi;Menu l = new Menu("播放列表 ";Menu c = new Menu("播放控制 ";MenuItem move = new MenuItem("播放 "; move.addActionListener(this;c.add(move;c.addSeparator(;MenuItem pause = new MenuItem("暂停 "; pause.addActionListener(this;c.add(pause;c.addSeparator(;MenuItem stop = new MenuItem("停止 "; stop.addActionListener(this; c.add(stop;c.addSeparator(;//设置一个菜单栏MenuBar mb = new MenuBar(;//将设置的菜单依次加入程序的菜单栏中去 mb.add(f;mb.add(c;mb.add(l;//将构造完成的菜单栏交给当前程序的窗口; setMenuBar(mb;}//事件响应成员;捕捉发送到本对象的各种事件; public void actionPerformed(ActionEvent e {//设一个字符串用于暂存打开的媒体文件的路径; String cufile , selcectfile;// 调用 dispose 以便执行 windowCloseddispose(;return;}//次事件表明用户选择了 " 播放 " 菜单命令;//如果当前有一个文件可以播放则执行播放命令;if (e.getActionCommand(.equals("播放 " {if (player != null {player.start(;}return;}//如果当前正在播放某一文件,则执行暂停;if (e.getActionCommand(.equals("暂停 " {if (player != null {player.stop(;}return;}//次事件表明用户选择了 " 播放 " 菜单命令;//如果当前有一个文件可以播放则执行播放命令;if (e.getActionCommand(.equals("停止 " {if (player != null {player.stop(;player.setMediaTime(new Time(0;}return;}//用户选择要播放的媒体文件if (e.getActionCommand(.equals("打开 " {FileDialog fd = new FileDialog(this, " 打开媒体文件 ", FileDialog.LOAD; fd.setDirectory(currentDirectory;fd.show(;// 如果用户放弃选择文件,则返回if (fd.getFile( == nullreturn;//保存了所选文件的名称及其全路径名称已被稍后使用//同时设置当前文件夹路径selcectfile = fd.getFile(;currentDirectory = fd.getDirectory(;cufile = currentDirectory + selcectfile;//将用户选择的文件作为一个菜单项加入播放列表该菜单项 " 名为 " 该文件名; //被点击后给出的命令串是该文件的全路径名MenuItem mi = new MenuItem(selcectfile;mi.setActionCommand(cufile;MenuBar mb = getMenuBar(;Menu m = mb.getMenu(2;mi.addActionListener(this;m.add(mi;} else {//程序逻辑运行到此表示用户选择了一个 " 播放列表 " 中的媒体文件//此时可以通过如下动作获得该文件的全路径名;cufile = e.getActionCommand(;selcectfile = cufile;}//如果已存在一个播放器,则先将其关闭,稍后重新创建//创建播放器时需要捕捉一些异常;if (player != nullplayer.close(;try {player = Manager.createPlayer(new MediaLocator("file:" + cufile; } catch (java.io.IOException e2 {System.out.println(e2;return;} catch (NoPlayerException e2 {System.out.println("不能找到播放器 .";return;}if (player == null {System.out.println("无法创建播放器 .";return;}first = false;setTitle(selcectfile;//设置处理播放控制器实际的对象; player.addControllerListener(this;player.prefetch(; } //因为实现了"ControllerListener"接口,本方法用于处理媒体播放器传来的事件; public void controllerUpdate(ControllerEvent e { Container tainer = getContentPane(; // // // if 调用 player.close(时 ControllerClosedEvent 事件出现。