【IT168 技术文档】本文主要介绍OPhone平台下多媒体应用程序开发涉及到的基本知识,常用概念,相关的类及一些参考代码。使您阅读完后,对OPhone平台的多媒体应用程序开发有一个大致了解,能够迅速上手开发多媒体应用。
Android系统架构中的多媒体
图1是Android开发人员比较熟悉的Android系统架构图,自低向上都能看见多媒体相关的组件包括多媒体Driver,多媒体Native库, 多媒体框架层,多媒体应用。
多媒体Driver
负责和硬件进行交互数据包括Audio Driver, Camera Driver,Display Driver等等,与其他Linux版本的Driver 类似
多媒体Native库
通常称之为OpenCore,它是Anroid多媒体的核心,来源于PacketVideo。对比Android的其它程序库,OpenCore的代码非常庞大,它是一个基于C++的实现,定义了全功能的操作系统移植层,各种基本的功能均被封装成类的形式,各层次之间的接口多使用继承等方式。
OpenCore是一个多媒体的框架,它主要包含了两大方面的内容:
- PVPlayer:提供媒体播放器的功能,完成各种音频(Audio)、视频(Video)流的回放(Playback)功能
- PVAuthor:提供媒体流记录的功能,完成各种音频(Audio)、视频(Video)流的以及静态图像捕获功能
在实际多媒体应用的开发中我们并不会过多的研究OpenCore的实现,有兴趣的可以在网上搜索OpenCore的详细资料。Android中提供了上层(Java 层)的Media API给开发人员使用,MediaPlayer和MediaRecorder

多媒体框架层
多媒体框架层Android中间层,也是Java SDK层。向下通过JNI负责封装OpenCore,向上负责为多媒体应用程序提供Java接口。所有的多媒体相关的类和接口都包含在 android.media这个package当中,包括 AudioFormat,AudioManager,AudioTrack,MediaPlayer,MediaRecorder, Ringtone, RingtoneManager等等。其中MediaPlayer和MediaRecorder是最为主要的两个类。
MediaPlayer主要接口
提供了一个多媒体播放器常用的基本操作如播放,暂停,停止,获取文件播放长度,Seek 等等。
static MediaPlayer create(Context context, Uri uri)
Convenience method to create a MediaPlayer for a given Uri.
int getCurrentPosition()
Gets the current playback position.
int getDuration()
Gets the duration of the file.
int getVideoHeight()
Returns the height of the video.
int getVideoWidth()
Returns the width of the video.
boolean isPlaying()
Checks whether the MediaPlayer is playing.
void pause()
Pauses playback.
void prepare()
Prepares the player for playback, synchronously.
void prepareAsync()
Prepares the player for playback, asynchronously.
void release()
Releases resources associated with this MediaPlayer object.
void reset()
Resets the MediaPlayer to its uninitialized state.
void seekTo(int msec)
Seeks to specified time position.
void setAudioStreamType(int streamtype)
Sets the audio stream type for this MediaPlayer.
void setDataSource(String path)
Sets the data source (file-path or http/rtsp URL) to use.
void setDisplay(SurfaceHolder sh)
Sets the SurfaceHolder to use for displaying the video portion of the media.
void setVolume(float leftVolume, float rightVolume)
Sets the volume on this player.
void start()
Starts or resumes playback.
void stop()
Stops playback after playback has been stopped or paused.
MediaRecorder主要接口
提供了声音录制的基本功能。
Prepares the recorder to begin capturing and encoding data.
void release()
Releases resources associated with this MediaRecorder object.
void reset()
Restarts the MediaRecorder to its idle state.
void setAudioEncoder(int audio_encoder)
Sets the audio encoder to be used for recording.
void setAudioSource(int audio_source)
Sets the audio source to be used for recording.
void setOutputFile(String path)
Sets the path of the output file to be produced.
void setOutputFormat(int output_format)
Sets the format of the output file produced during recording.
void setPreviewDisplay(Surface sv)
Sets a Surface to show a preview of recorded media (video).
void start()
Begins capturing and encoding data to the file specified with setOutputFile().
void stop()
Stops recording.
多媒体应用
多媒体应用层处在整个多媒体结构中最上层,全部由纯Java应用程序构成。Android系统本身就内置了丰富的多媒体应用程序包括Music Playback, Camera,Picture Viewer 等等。
Android MediaPlayer 类支持播放数据来源不同的Audio和Video,例如来源于文件系统中的,应用程序资源包中的,以及来源于网络中的流媒体数据。
Audio本地和流媒体播放
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(Audio_PATH);
mp.prepare();
mp.start();
}
如上代码所示,由于Android良好的接口设计,Audio播放非常简单,关键的4行代码即可完成Audio播放过程。
1.新建一个MediaPlayer 实例
2.调用setDataSource()方法设置播放文件的路径,该路径既可以是本地文件如/sdcard/test.mp3,也可以是网络流媒体数据如 http://www.monternet.com/test/test.mp3
3.调用prepare()方法,使底层openCore初始化数据。同时mediaplayer还提供另外一个接口prepareasync(), 你可以异步监听当前数据是否准备好播放。
4.一旦prepare()完成,便可以调用start()方法开始播放,
如果想暂停播放,可以调用pause()方法,如果想停止播放,可以调用stop()方法。
Video本地和流媒体播放
public void playVideo() {
mp.setDataSource(Video_PATH);
mp.setDisplay(surfaceholder);
mp.prepare();
mp.setOnpreparedListerner(this);
}
public void onPrepared(MediaPlayer mediaplayer) {
mp.start();
}
如上代码所示,由于Android良好的接口设计,Video播放也非常简单,仅仅比Audio播放多增加setDisplay()一个调用,其他的处理方式与播放Audio一致。
1. 新建一个MediaPlayer 实例
2.调用setDataSource()方法设置播放文件的路径,该路径既可以是本地文件如/sdcard/test.mp4,也可以是网络流媒体数据如 http://www.monternet.com/test/test.mp4
3.调用setDisplay()方法,设置surfaceholder。surfaceholder 用来获取用户定义的surfaceview, 这个surfaceview就是用来显示Video的区域。可以通过如下方法获取surfaceholder
SurfaceHolder surfaceholder = mPreview.getHolder()
4.调用prepare()方法,使底层openCore初始化数据。同时监听当前Video数据是否准备好播放。Video相对于Audio 需要更长的准备时间。
5.一旦prepare()完成,便可以调用start()方法开始播放,
如果想暂停播放,可以调用pause()方法,如果想停止播放,可以调用stop()方法。
参考图2了解Audio/Video播放在android系统中的实际调用过程。

Audio 录制
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(path);
recorder.prepare();
recorder.start();
}
如上代码所示,由于Android良好的接口设计,Audio的录制播放也非常简单。
- 新建一个MediaRecorder 实例
- 调用setAudioSource() 设定声音来源,当前为MIC
- 调用setOutputFormat()方法设定输出格式,当前为3gpp
- 调用setAudioEncoder()方法设定编码方式,当前为AMR_NB
- 调用setOutputFile(path)方法设置录制文件的路径,如/sdcard/recorder.3gpp
- 调用prepare()方法,使底层openCore初始化数据。
- 一旦prepare()完成,便可以调用start()方法开始录制
- 如果想停止录制,可以调用stop()方法。
Android支持的媒体格式
Android支持当前市面上手机能够支持绝大部分多媒体格式,具体参见下表。(作者:张金云)
