OPhone的多媒体模块是基于PacketVideo的OpenCORE引擎,不但支持多种解码器,而且对网络多媒体播放的支持也非常出色。如此复杂的功能却丝毫没有拖累API的设计,OPhone的多媒体框架API设计得非常简单、易用。本节主要介绍音频和视频的播放功能,这也是多媒体应用程序最常用到的。
OPhone平台可以通过资源文件、文件系统和网络三种方式来播放多媒体文件。无论使用哪种播放方式,基本的流程都是类似的。当然也存在一些细小的差别,比如,直接调用MediaPlayer.create()方法创建的MediaPlayer对象已经设置了数据源,并且调用了prepare()方法。从网络播放媒体文件,在prepare阶段的处理与其他两种方式不同,为了避免阻塞用户,需要异步处理。但是,音乐播放还是遵循了下面的4步流程。
l 创建MediaPlayer对象;
l 调用setDataSource()设置数据源;
l 调用prepare()方法;
l 调用start()开始播放。
多媒体文件可以放在资源文件夹/res/raw下,然后通过MediaPlayer.create()方法创建MediaPlayer对象。由于create(Context ctx,int file)方法中已经包含了多媒体文件的位置参数file,因此无须再设置数据源,调用prepare()方法,这些操作在create()方法的内部已经完成了。获得MediaPlayer对象后直接调用start()方法即可播放音乐。
l private void playFromRawFile() {
l //使用MediaPlayer.create()获得的
l //MediaPlayer对象默认设置了数据源并初始化完成了
l MediaPlayer player = MediaPlayer.create(this, R.raw.test);
l player.start();
l }
如果开发一个多媒体播放器,一定需要具备从文件系统播放音乐的能力。这时不能再使用MediaPlayer.create()方法创建MediaPlayer对象,而是使用new操作符创建MediaPlayer对象。获得MediaPlayer对象之后,需要依次调用setDataSource()和prepare()方法,以便设置数据源,让播放器完成准备工作。从文件系统播放MP3文件的代码如下所示:
l private void playFromSDCard() {
l try {
l MediaPlayer player = new MediaPlayer();
l //设置数据源
l player.setDataSource("/sdcard/a.mp3");
l player.prepare();
l player.start();
l } catch (IllegalArgumentException e) {
l e.printStackTrace();
l } catch (IllegalStateException e) {
l e.printStackTrace();
l } catch (IOException e) {
l e.printStackTrace();
l }
l }
需要注意的是,prepare()方法是同步方法,只有当播放引擎已经做好了准备,此方法才会返回。如果在prepare()调用过程中出现问题,比如文件格式错误等,prepare()方法将会抛出IOException。
在移动互联网时代,移动多媒体业务有着广阔的前景,中国移动的“移动随身听”业务一直有着不错的表现。事实上,开发一个网络媒体播放器并不容易。某些平台提供的多媒体框架,并不支持“边下载,边播放”的特性,而是将整个媒体文件下载到本地后再开始播放,用户体验较差。在应用层实现“边下载,边播放”的特性是一项比较复杂的工作,一方面需要自己处理媒体文件的下载和缓冲,另一方面还需要处理媒体文件格式的解析,以及音频数据的拆包和拼装等操作。项目实施难度较大,项目移植性差,最终的发布程序也会比较臃肿。
OPhone多媒体框架带来了完全不一样的网络多媒体播放体验。在播放网络媒体文件时,下载、播放等工作均由底层的PVPlayer来完成,在应用层开发者只需要设置网络文件的数据源即可。从网络播放媒体文件的代码如下所示:
l private void playFromNetwork() {
l String path = "http://website/path/file.mp3";
l try {
l MediaPlayer player = new MediaPlayer();
l player.setDataSource(path);
l player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
l public void onPrepared(MediaPlayer arg0) {
l arg0.start();
l }
l
l });
l //播放网络上的音乐,不能同步调用prepare()方法
l player.prepareAsync();
l } catch (IllegalArgumentException e) {
l e.printStackTrace();
l } catch (IllegalStateException e) {
l e.printStackTrace();
l } catch (IOException e) {
l e.printStackTrace();
l }
l }
从上面的代码可以看出,从网络播放媒体文件与从文件系统播放媒体文件有一点不同,就是从网络上播放媒体文件时需要调用prepareAsync()方法,而不是prepare()方法。因为从网络上下载媒体文件、分析文件格式等工作是比较耗费时间的,prepare()方法不能立刻返回,为了不堵塞用户,应该调用prepareAsync()方法。当底层的引擎已经准备好播放此网络文件时,会通过已经注册的onPreparedListener()通知MediaPlayer,然后调用start()方法就可以播放音乐了。短短的几行代码已经可以播放网络多媒体文件了,这就是OPhone平台带给开发者的神奇体验,不得不赞叹OPhone的强大之处。
运行chapter7_1,如图7-2所示。此实例存在很多不足,没有提供播放界面,无法控制播放器的状态(暂停、停止、快进/快退等),没有考虑MediaPlayer对象的销毁工作。这可能导致底层用于播放媒体文件的硬件这一非常宝贵的资源被占用。解决这些问题的核心是掌握MediaPlayer的状态,并根据MediaPlayer的状态做出正确的处理。
中国移动创新系列丛书
书名:OPhone应用开发权威指南
丛书主编:中国移动通信研究院院长 黄晓庆
詹建飞 田 淼 吴 博 吕志虎 编著
ISBN 978-7-121-09735-5
出版日期:2009年12月出版
定价:58.00元(含光盘1张)
开本:16开
页码:480页
内 容 简 介
本书系统地介绍了OPhone平台的体系结构、应用程序开发流程和调试技巧、OPhone应用程序开发中涉及的主要模块。全书结合30多个经典案例,阐述了OPhone平台的运行环境、应用程序模型、用户界面与图形引擎、数据持久化存储方案、移动多媒体框架、Service、联网接口、高级通信技术以及访问硬件层能力等内容。在介绍OPhone这一崭新的移动开发平台的同时,作者融入了大量经典设计模式、工程项目开发技巧的介绍,使得本书在实际项目开发中具有重要的参考价值。
本书适合有一定Java编程基础,希望从Symbian、Java ME或者Windows Mobile等平台过渡到OPhone平台的软件开发人员阅读,也可以作为高校师生的参考教材。
本书特色
全书结合30多个经典案例,阐述了OPhone平台的运行环境、应用程序模型、用户界面与图形引擎、数据持久化存储方案、移动多媒体框架、Service、联网接口、高级通信技术以及访问硬件层能力等内容。
在介绍OPhone这一崭新的移动开发平台的同时,作者融入了大量经典设计模式、工程项目开发技巧的介绍,使得本书在实际项目开发中具有重要的参考价值。