Android提供了播放音频和视频文件的标准方式:MediaPlayer类。对于音频内容,还可以播放原始数据,这在复杂的应用中很有用,可以动态生成音频数据。
MediaPlayer在其生命周期中要经历以下几种状态:
Idle
MediaPlayer完成实例化。
Initialized
设置媒体资源。
Preparing
MediaPlayer在准备要播放的媒体资源。
Prepared
MediaPlayer已经准备好播放。
Started
开始播放。
Paused
播放暂停。
Playback complete
媒体资源播放完成(可以再次开始播放)。
Stopped
MediaPlayer不再打算播放资源。
End
删除了MediaPlayer,释放资源。
关于这些状态的详细信息,可以查看开发者网站中提供的状态图:http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram。要使用MediaPlayer,列出将其添加到应用中所需的各个步骤是很有帮助的:
1.调用create方法创建MediaPlayer实例(空闲状态)。
2.使用要播放的媒体资源初始化MediaPlayer(初始化状态)。
3.调用prepare方法,让MediaPlayer为播放做好准备(包含正在准备和已准备好状态)。
4.调用start方法使MediaPlayer进入播放状态(启动状态)。
5.在播放过程中,可以随意暂停、停止或重播MediaPlayer(启动、暂停、回放完成和停止状态)。
6.一旦完成播放,记得调用release方法,释放MediaPlayer相关的资源(最终状态)。
本章后续内容将对这些步骤进行更详细的介绍。
音频播放
播放音频有两种方式:MediaPlayer和AudioTrack。MediaPlayer是标准的、简单的播放方式,其数据必须是文件形式的或基于流的。相反,AudioTrack直接访问内存中的原始音频数据。
MediaPlayer音频播放
第一次使用MediaPlayer时,应该确定是否要使用应用资源中的文件。如果要使用,MediaPlayer提供了很方便的静态方法,它可以设置数据源并让播放器做好准备:
MediaPlayer mediaplayer = MediaPlayer.create(this, R.raw.example);
如果不使用应用资源,例如指向文件系统(如SD卡等)中的音频文件,或者是在Web站点上的音频文件(如http://SomeServer/SomeAudioFile.mp3),则需要手工设置和调用数据源。可以使用下面这个方法从URI中获取数据:
setDataSource(context, uri)
第一个参数context是MediaPlayer访问应用本身的资源的途径,以便能够解析URI,其可以是应用的context或活动的context。
另一种方式是通过绝对路径调用:
setDataSource(path)
API版本9支持把一些辅助效果(如混响效果)添加到播放器中。在调用prepare方法之前,设置数据源时可以设置任何你想要的效果:
MediaPlayer mediaplayer = new MediaPlayer;// Uri mediaReference = /"http://someUriToaMediaFile.mp3/";// mediaplayer.setDataSource(this, mediaReference);// use absolute pathmediaplayer.setDataSource(/"/sdcard/somefile.mp3/");// prepare mediaplayermediaplayer.prepare;
MediaPlayer准备好后,就可以播放了:
mediaplayer.start;
在播放过程中,播放器可以暂停或停止。当处于暂停状态时,可以再次调用start方法启动播放。一旦MediaPlayer被停止了,则需要执行reset方法进行重置,使用之前的数据源重新初始化,并调用prepare方法,才能重新启动。先来看看以下代码:
mediaplayer.pause; // pausingmediaplayer.start; // going from pause to playmediaplayer.stop; // stopping...// to be able to play again reset must be calledmediaplayer.reset;// now the media player must be reinitialized to play again
当MediaPlayer正在播放时,可以通过getCurrentPosition方法跟踪文件的当前位置,它会返回文件已经播放了多长时间,单位是ms:
mediaplayer.getCurrentPosition;
一旦不再需要MediaPlayer,要确保释放它,这样就可以释放资源给系统使用:
mediaplayer.release;
AudioTrack音频播放
AudioTrack提供了更直接的音频播放方式。下面这个例子说明了如何设置AudioTrack的各个参数:
File mediafile = new File(mediaFilePath);short audio = new short[(int) (mediafile.length/2)];// read in file and fill up audioAudioTrack audiotrack = new AudioTrack( // stream type AudioManager.STREAM_MUSIC, // frequency 11025, // channel config—mono, stereo, etc. AudioFormat.CHANNEL_CONFIGURATION_MONO, // audio encoding AudioFormat.ENCODING_PCM_16BIT, // length audio.length, // mode AudioTrack.MODE_STREAM );
AudioTrack方法提供音频流的类型(音乐、铃声、报警、语音呼叫等)、以Hz表示的采样比率(44100、22050和11025)、音频配置(单声道或立体声)、音频格式/编码、以字节数表示的音频长度、模式(静态或流式)。配置好Android的AudioTrack后,它自己知道如何使用设备的硬件接口,并能提供流畅的音乐播放体验。
要播放音频,只需执行play方法,就可以把数据写到硬件中:
// start playing stateaudiotrack.play;// write audio to hardwareaudiotrack.write(audio, 0, audio.length);
要暂停播放,可以使用pause方法:
// pauseaudiotrack.pause;
要停止播放,可以把它设置成停止状态。如果不再需要播放音频,就要释放资源。如果要重新播放音频,则必须重新执行初始化:
// stopaudiotrack.stop;// release all resourcesaudiotrack.release;
视频播放
视频播放和音频播放不同,其只能使用MediaPlayer。没有类似AudioTrack功能的视频播放器。对于MediaPlayer,视频播放和音频播放类似,但是这里还必须指定一个视图(名为surface),视频在该视图上显示。Android提供了包括surface在内的便捷的控制方式:VideoView视图。下面将给出其使用方式。它还包含可选的控制器,该控制器支持用户通过简单的界面控制播放,包括启动、停止及暂停播放的各个按钮,以及用来控制视频播放进度的可向前或向后拖动的进度条:
// create the view (in this case it is already included in the layout resource)VideoView videoview = (VideoView) findViewById(R.id.videoview);videoview.setKeepScreenOn(true);// used if streamingif (videouri != null) videoview.setVideoURI(videouri);// absolute path if it is a fileelse videoview.setVideoPath(videopath);// let/'s add a media control so we can control the playbackmediacontroller = new MediaController(this);mediacontroller.setAnchorView(videoview);videoview.setMediaController(mediacontroller);if (videoview.canSeekForward)videoview.seekTo(videoview.getDuration/2);// start the playbackvideoview.start;