E N D
Symbian的媒体播放 ——陈佳栋
MMF • Symbian多媒体框架(MMF)为各种多媒体应用(如S60音乐播放器和媒体播放器)提供了一些高级API。MMF拥有一个插件架构,它使用了多种类型的用于媒体回放和录制的插件。所有的媒体录制和回放都由MMF控制器插件完成。一个MMF控制器可使用一些附加插件,用于媒体处理,如MMF编码解码器等。通过增加一些实现了新型编码解码和文件格式的控制器插件,就可对MMF 进行扩展。如要回放一个多媒体文件或URL,MMF框架将选择一种控制器插件来播放这个文件或URL。控制器插件可以载入其它的插件(如编码解码器等)。
流媒体播放采用CMdaAduioOutputStream类, 本地音频播放采用CMdaAudioPlayerUtility类 用RealPlayer引擎支持视频和音频回放及流
1. S60用多媒体框架(MMF)实现视频和音频的回放和录制,其拥有一个插件架构,可使用多种类型的用于媒体回放和录制的插件,比如RealPlayer引擎是针对MMF控制器的插件,支持视频和音频回放及流。 • 2. s60内置播放器采用Realplayer引擎。不支持HTTP流媒体,因为在显示之前必须把所有的视频数据一次性读入缓存。 • 3. S60的常用格式是 MP4(编解码标准为H.263和MPEG4)、3GP(H.263和MPEG4) • 一般来说手机上网的视频格式最流行的就是3GP,因为体积小.但缺点就是分辨率相对低. MP4也是受欢迎格式之一,但MP4体积相对3GP较大,分辨率相对高一些.
优点:实现简单 缺点:只是单纯地调用手机上的播放器,局限很大 优点:用系统API就能播放本地文件和RTSP流 缺点:不能支持更多的视频格式 优点:支持更多的视频格式 缺点:限于本地文件 优点:功能齐全 缺点:代码复杂,需要大量时间
从上表得出结论,CVideoPlayerUtility用来开发视频剪辑的播放和录制。如果要开发一个读取本地文件或RTSP流而且格式为MP4、3GP或Rmvb的播放器,使用CVideoPlayerUtility就够了。但如果需要读取网络数据流,就必须用network APIs连接到网络获取数据,接着用CDirectScreenAccess API绘制屏幕,当中主要步骤有RTP传输,mpeg4/h264解码,yuv2rgb转换。如果不用symbian的API,流媒体传输可移植live555,视音频解码可用ffmpeg。
MMF框架的功能 • MMF为每个plug-in创建2个线程,一个做client一个做server,这些线程都在调用MMF API的进程中。 • client/server之间的ITC是通过TMMFMessage进行的,每一个msg都包括Interface ID和Destination handle,这样MMF框架就知道把这个消息传递给那个server。 • 客户端的大多数api都封装在utility class里面,这些类都有一个RMMFController,server端有与之对应的CMMFController,它们通过RMMFControllerProxy的SendSync和SendAsync发送消息。
MMF框架下多媒体插件的接口 • 1. Open and Close • RMMFController::Open(id) - 打开一个plug-in controller,在单独的线程中运行 • RMMFController::Close() - 释放对应的controller • 2. Source and Sink • AddDataSource() 和AddDataSink()方法用来管理Source 和 Sink, Controller的主要功能就是将数据从source流到sink • 3.Changing state • 一般Controller有Stop, Prime, Play三个状态
4.Adjusting play-head position API • 查询和调整播放的位置,获得播放头位置GetPosition,设置播放头位置SetPosition,获得播放时间GetDuration • 5.Retrieving metadata API • GetMetaDataEntryL用来获得元数据条目 • GetNumberOfMetaDataEntries用来获得元数据条目的数量 • 6.Handling custom commands API • 前面的函数都是标准接口,要想扩展接口,可以通过CustomCommandSync和CustomCommandAsync发出调用函数的请求。server端的函数执行后,可以通过参数返回执行结果。
CVideoPlayerUtility举例 • MediaEngine.h • class CMediaEngine : public CBase ,public MVideoPlayerUtilityObserver • { • public: • CMediaEngine (); • void ConstructL(CMediaContainer* aView); • static CMediaEngine * NewL(CMediaContainer* aView ); • void InitControllerL(); • void MvpuoOpenComplete(TIntaError); 提供的文件格式,初始化plug-in codec
通过内置的rtsp协议与服务器通信,建立连接 • void MvpuoPrepareComplete(TIntaError); • void MvpuoFrameReady(CFbsBitmap& aFrame,TIntaError); • void MvpuoPlayComplete(TIntaError); • void MvpuoEvent(const TMMFEvent& aEvent); • void PauseL(); • void IncreaseVolume(); • void DecreaseVolume();
TTimeIntervalMicroSecondsPositionL() ; • TTimeIntervalMicroSecondsDurationL() ; • void Stop(); ~CMediaEngine (); • private: • CVideoPlayerUtility* iPlayer; CMediaContainer* iView; • }; 发出rtsp的PLAY请求,这时候可以通过MvloLoadingStarted()得到开始缓冲的信息