首页 » Android程序设计:第2版 » Android程序设计:第2版全文在线阅读

《Android程序设计:第2版》播放音频和视频

关灯直达底部

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;