Symbian的媒体播放

Download Report

Transcript Symbian的媒体播放

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(TInt aError);
•
提供的文件格式,初始化plug-in codec
•
•
•
•
•
•
•
void MvpuoPrepareComplete(TInt
aError);
通过内置的rtsp协议与服务器通信,建立连接
void MvpuoFrameReady(CFbsBitmap&
aFrame,TInt aError);
void MvpuoPlayComplete(TInt aError);
void MvpuoEvent(const TMMFEvent&
aEvent);
void PauseL();
void IncreaseVolume();
void DecreaseVolume();
•
TTimeIntervalMicroSeconds PositionL() ;
•
TTimeIntervalMicroSeconds DurationL() ;
•
void Stop(); ~CMediaEngine ();
• private:
•
CVideoPlayerUtility* iPlayer;
CMediaContainer* iView;
• };
发出rtsp的PLAY请求,这时候可以通过
MvloLoadingStarted()得到开始缓冲的信息