java 播放声音代码
- 格式:doc
- 大小:32.50 KB
- 文档页数:7
基于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的发展,软件的跨平台性又被提高到另一个新的要求。
Java Sound API是javaSE平台提供底层的(low-level)处理声音接口。
例外,java也提供了简单的实用的高层媒体接口(higher-level) -JMF(Java Media Framework)。
Java Sound API 将需要处理的数字音频分为:simpled-audio和midi,分别提供Package来处理它们:javax.sound.simpledjavax.sound.midi同时SOUND API还提供了第三方的扩展接口:javax.sound.simpled.spijavax.sound.midi.spi*注:spi : service provider interfaceSampled Audio采样音频(simpled-audio)不仅包含从模拟信号采样来的数字音频,还包括电脑合成的。
称作digital-audio更为合适。
为了能够让设备播放采样声音,程序需要处理audio input, output device, audio data buffers。
还有混音处理(mix multiple streams of audio into one stream)。
SOUND API 可以使用3种方式传输声音数据:stream, buffered fashion, in-memory unbuffered fashion。
第三种方式适合数据量不大,能够一次载入的所有数据的情形。
这样,声音的响应较快,循环和随机定位也会很简单。
使用SOUND API播放声音至少需要3样东西:l formatted audio data,l a mixer,l a line.Mixer调音台technically the Mixer itself is also a kind of LineLine音频数据管道。
Clip extends Line将需要播放的音频数据装载进来。
Android 提供了MediaPlayer 和MediaRecorder 两个工具类,来帮助开发者操作音频和视频。
我们通过两个小例子来学习一下多媒体资源的使用。
一、简单音乐播放器1、新建一个项目Lesson28_Music , 主Activity的名字是MainMusic.java2、拷贝这几张图片到res/drawable目录下,并建立3个xml文件,拷贝love.mp3到res/raw文件中。
play.xml1 <?xml version="1.0" encoding="utf-8"?>2 <SELECTOR xmlns:android="/apk/res/android">3 <ITEM android:state_enabled="false" android:drawable="@drawable/play_disable" /> <!-- state_enabled=false -->4 <ITEM android:drawable="@drawable/play_50" /> <!-- default -->5 </SELECTOR>pause.xml1 <?xml version="1.0" encoding="utf-8"?>2 <SELECTOR xmlns:android="/apk/res/android">3 <ITEM android:state_enabled="false" android:drawable="@drawable/pause_disable" /> <!-- state_enabled=false -->4 <ITEM android:drawable="@drawable/pause_50" /> <!-- default -->5 </SELECTOR>stop.xml1 <?xml version="1.0" encoding="utf-8"?>2 <SELECTOR xmlns:android="/apk/res/android">3 <ITEM android:state_enabled="false" android:drawable="@drawable/stop_disable" /> <!-- state_enabled=false -->4 <ITEM android:drawable="@drawable/stop_50" /> <!-- default -->5 </SELECTOR>3、res/layout/main.xml 的内容如下:01 <?xml version="1.0" encoding="utf-8"?>02 <LINEARLAYOUT xmlns:android="/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">03 <TEXTVIEW android:layout_width="fill_parent" android:layout_height="wrap_content" android:textsize="25sp" android:text="简单音乐播放器" />04 </LINEARLAYOUT>05 <LINEARLAYOUT xmlns:android="/apk/res/android"android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent">0607 <IMAGEBUTTON android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/play" android:background="@drawable/play" android:adjustviewbounds="true" android:layout_margin="4dp">08 </IMAGEBUTTON>0910 <IMAGEBUTTON android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/pause" android:background="@drawable/pause" android:adjustviewbounds="true" android:layout_margin="4dp">11 </IMAGEBUTTON>1213 <IMAGEBUTTON android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/stop" android:background="@drawable/stop" android:adjustviewbounds="true" android:layout_margin="4dp">14 </IMAGEBUTTON>15 </LINEARLAYOUT>4、MainMusic.java的内容如下:001 package android.basic.lesson28; 002003 import java.io.IOException;004005 import android.app.Activity;006 import android.media.MediaPlayer;007 import android.media.MediaPlayer.OnCompletionListener; 008 import android.media.MediaPlayer.OnPreparedListener; 009 import android.os.Bundle;010 import android.view.View;011 import android.view.View.OnClickListener;012 import android.widget.ImageButton;013 import android.widget.Toast;014015 public class MainMusic extends Activity {016017 // 声明变量018 private ImageButton play, pause, stop;019 private MediaPlayer mPlayer;020021 /** Called when the activity is first created. */022 @Override023 public void onCreate(Bundle savedInstanceState) {024 super.onCreate(savedInstanceState);025 setContentView(yout.main);026027 // 定义UI组件028 play = (ImageButton) findViewById(R.id.play);029 pause = (ImageButton) findViewById(R.id.pause); 030 stop = (ImageButton) findViewById(R.id.stop);031032 // 按钮先全部失效033 play.setEnabled(false);034 pause.setEnabled(false);035 stop.setEnabled(false);036037 // 定义单击监听器038 OnClickListener ocl = new View.OnClickListener() { 039040 @Override041 public void onClick(View v) {042 switch (v.getId()) {043 case R.id.play:044 // 播放045 Toast.makeText(MainMusic.this, "点击播放", Toast.LENGTH_SHORT) 046 .show();047 play();048 break;049 case R.id.pause:050 // 暂停051 Toast.makeText(MainMusic.this, "暂停播放", Toast.LENGTH_SHORT) 052 .show();053 pause();054 break;055 case R.id.stop:056 // 停止057 Toast.makeText(MainMusic.this, "停止播放", Toast.LENGTH_SHORT) 058 .show();059 stop();060 break;061 }062 }063 };064065 // 绑定单击监听066 play.setOnClickListener(ocl);067 pause.setOnClickListener(ocl);068 stop.setOnClickListener(ocl);069070 // 初始化071 initMediaPlayer();072 }073074 // 初始化播放器075 private void initMediaPlayer() {076077 // 定义播放器078 mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.love);079080 // 定义资源准备好的监听器081 mPlayer.setOnPreparedListener(new OnPreparedListener() {082 @Override083 public void onPrepared(MediaPlayer mp) {084 // 资源准备好了再让播放器按钮有效085 Toast.makeText(MainMusic.this, "onPrepared", Toast.LENGTH_SHORT) 086 .show();087 play.setEnabled(true);088 }089 });090091 // 定义播放完成监听器092 mPlayer.setOnCompletionListener(new OnCompletionListener() {093094 @Override095 public void onCompletion(MediaPlayer mp) {096 Toast.makeText(MainMusic.this, "onCompletion",097 Toast.LENGTH_SHORT).show();098 stop();099 }100 });101 }102103 // 停止播放104 private void stop() {105 mPlayer.stop();106 pause.setEnabled(false);107 stop.setEnabled(false);108 try {109 mPlayer.prepare();110 mPlayer.seekTo(0);111 play.setEnabled(true);112 } catch (IllegalStateException e) {113 e.printStackTrace();114 } catch (IOException e) {115 e.printStackTrace();116 }117118 }119120 // 播放121 private void play() {122123 mPlayer.start();124 play.setEnabled(false); 125 pause.setEnabled(true); 126 stop.setEnabled(true); 127 }128129 // 暂停130 private void pause() {131 mPlayer.pause();132 play.setEnabled(true); 133 pause.setEnabled(false); 134 stop.setEnabled(true); 135 }136137 // Activity销毁前停止播放138 @Override139 protected void onDestroy() { 140 super.onDestroy();141 if (stop.isEnabled()) { 142 stop();143 }144145 }146147 }5、运行程序,查看效果二、简单视频播放器Android为视频播放提供了VideoView 和MediaController 两个现成的组件,让我们可以方便的实现MP4、3GP等视频的播放。
Android深⼊浅出之AudioTrack分析Android深⼊浅出之Audio第⼀部分 AudioTrack分析⼀⽬的本⽂的⽬的是通过从Audio系统来分析Android的代码,包括Android⾃定义的那套机制和⼀些常见类的使⽤,⽐如Thread,MemoryBase等。
分析的流程是:l 先从API层对应的某个类开始,⽤户层先要有⼀个简单的使⽤流程。
l 根据这个流程,⼀步步进⼊到JNI,服务层。
在此过程中,碰到不熟悉或者第⼀次见到的类或者⽅法,都会解释。
也就是深度优先的⽅法。
1.1 分析⼯具分析⼯具很简单,就是sourceinsight和android的API doc⽂档。
当然还得有android的源代码。
我这⾥是基于froyo的源码。
注意,froyo源码太多了,不要⼀股脑的加⼊到sourceinsight中,只要把framwork⽬录下的源码加进去就可以了,后续如要⽤的话,再加别的⽬录。
⼆ Audio系统先看看Audio⾥边有哪些东西?通过Android的SDK⽂档,发现主要有三个:l AudioManager:这个主要是⽤来管理Audio系统的l AudioTrack:这个主要是⽤来播放声⾳的l AudioRecord:这个主要是⽤来录⾳的其中AudioManager的理解需要考虑整个系统上声⾳的策略问题,例如来电话铃声,短信铃声等,主要是策略上的问题。
⼀般看来,最简单的就是播放声⾳了。
所以我们打算从AudioTrack开始分析。
三 AudioTrack(JAVA层)JAVA的AudioTrack类的代码在:framework\base\media\java\android\media\AudioTrack.java中。
3.1 AudioTrack API的使⽤例⼦先看看使⽤例⼦,然后跟进去分析。
⾄于AudioTrack的其他使⽤⽅法和说明,需要⼤家⾃⼰去看API⽂档了。
//根据采样率,采样精度,单双声道来得到frame的⼤⼩。
利用VC++设计视频播放器一 需求分析制作一个视频播放器,能够播放多种格式的多媒体文件:CD 音乐曲目(.cda )、数字化波形声音(.WAV )、MIDI 文件(. mid, .rmi, .midi )、Windows Media 文件(. asf, .wm, .wma )、电影文件(. mpeg , . mpg , .mp3)、视频文件(.avi , . wmv )、音频文件(. wav , . snd , .au , .aif )等。
能够有用户自己选择文件,提供媒体播放控制:打开、播放、暂停、停止、全屏能控制播放音量的大小。
应用程序界面美观,使用方便,有完善的操控按钮或进度指示条等。
本课题对软硬件平台要求不高,操作系统可选择Windows2000/Window XP 。
在Visual C++ 6.0下用ActiveMovie 控件来实现。
本课程设计用例如图1所示,用户使用播放器,播放器完成媒体播放和音量调节两大功能。
<< use>> 用户图1 视频播放器UML 用例图二 对象分析由于播放器主要围绕实现以上两大功能,可以建立如表1所示的对象。
表1 播放器所建对象列表对象 属性 方法操作界面媒体文件、路径,媒体播放进度、状态,音量信息 显示媒体文件信息(文件名、路径) 媒体播放控制:打开文件、播放、暂停、停止、退出、全屏 显示播放信息(播放进度、状态)、控制音量 媒体播放媒体文件名、路径,控制命令 打开文件、播放、暂停、停止、退出、全屏 音量控制 音量调节 放大音量,减小音量音量控制和媒体播放对象对界面管理存在依赖关系,这两个对象要从界面获取控制指令,它们的属性要在界面上显示。
本播放器的类图如图2所示。
媒体播放 音量调节 播放器图2 播放器类图三 界面设计界面应满足以下要求:1. 界面首先要布置一系列按钮控件实现所有要实现的功能;2. 设置“播放进度条”来指示媒体文件的播放进度,还应该可以用鼠标拖动进度条来改变播放进度;3. 设置音量控制按钮(包括增大和减小);4. 界面应尽量美观;根据以上描述,程序运行时效果如图3所示。
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<线性)数据。
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import .*;
public class Sound extends Applet
implements ActionListener {
String onceFile = "file:/e:/myjava/eg0910/src/1.aif";
String loopFile = "file:/e:/myjava/eg0910/src/1.mid";
AudioClip onceClip;
AudioClip loopClip;
Button playOnce;
Button stopOnce;
Button startLoop;
Button stopLoop;
boolean looping = false;
boolean playing = false;
public void init() {
try{
onceClip= getAudioClip(new URL(onceFile));
loopClip = getAudioClip(new URL(loopFile));
}catch(MalformedURLException e){
}
playOnce = new Button("Play aif");
stopOnce = new Button("Stop aif");
stopOnce.setEnabled(false);
playOnce.addActionListener(this);
add(playOnce);
stopOnce.addActionListener(this) ;
add(stopOnce);
startLoop = new Button("Loop midi");
stopLoop = new Button("Stop Loop");
stopLoop.setEnabled(false);
startLoop.addActionListener(this);
add(startLoop);
stopLoop.addActionListener(this);
add(stopLoop);
}
public void stop() {
if (playing) {
onceClip.stop(); //暂停播放
}
if (looping) {
loopClip.stop(); //暂停循环播放}
}
public void start() {
if (playing)
{
onceClip.play(); //重新开始播放
}
if (looping) {
loopClip.loop(); //重新开始循环播放}
}
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
//响应play Button事件
if (source == playOnce) {
if (onceClip != null) {
playing = true;
// Thread t = new Thread(new t1());
// t.start();
//播放音乐文件
onceClip.loop();
//play按钮变灰,stop按钮可用
stopOnce.setEnabled(true);
playOnce.setEnabled(false);
showStatus("Playing sound " + onceFile + ".");
} else {
showStatus("Sound " + onceFile + " not loaded yet.");
}
return;
}
//响应stop Button事件
if (source == stopOnce) {
if (playing) {
playing = false;
//暂停播放
onceClip.stop();
//play按钮可用,stop按钮变灰
playOnce.setEnabled(true);
stopOnce.setEnabled(false);
}
showStatus("Stopped playing sound " + onceFile + ".");
return;
}
//响应loop Button事件
if (source == startLoop) {
if (loopClip != null) {
looping = true;
//开始声音的循环播放
loopClip.loop();
//loop按钮可用,stop loop按钮变灰
stopLoop.setEnabled(true);
startLoop.setEnabled(false);
showStatus("Playing sound " + loopFile + " continuously.");
} else {
showStatus("Sound " + loopFile + " not loaded yet.");
}
return;
}
//响应stop loop Button事件
if (source == stopLoop) {
if (looping) {
looping = false;
//停止声音的循环播放
loopClip.stop();
//loop按钮变灰,stop loop按钮可用
startLoop.setEnabled(true);
stopLoop.setEnabled(false);
}
showStatus("Stopped playing sound " + loopFile + ".");
return;
}
}
}。