Android的MediaPlayerService下一个重要的框架就是stagefright(演讲胆怯者),在它之下就是具体的播放器了。与其关系同等的是NuPlayer,本文将分析stagefright常规框架和一些关键技术。
先看几个类的关系:
class MediaPlayerBase : public RefBase
class MediaPlayerInterface : public MediaPlayerBase
class StagefrightPlayer : public MediaPlayerInterface
struct AwesomePlayer
struct AHandler : public RefBase
struct NuPlayer : public AHandler
struct NuPlayerDriver : public MediaPlayerInterface
以RefBase为基准,MediaPlayerBase和AHandler处于同一级,StagefrightPlayer与NuPlayerDriver为同一级,代表两种不同的架构的播放器。AwesomePlayer与NuPlayer为同一级,代表在两种不同播放器架构下具体的播放器实现。
一般说来,现在本地文件播放用AwesomePlayer,而流媒体用NuPlayer,难道是NuPlayer对RTP处理得更好?
一个播放器通常的架构或者说工作流程为:
创建播放器 – 设置数据源 – 音视频分离 – 编解码 – 渲染 – 画面呈现
先来看下AwesomePlayer的构造函数:
AwesomePlayer::AwesomePlayer()
: mQueueStarted(false),
mAudioPlayer(NULL),
mFlags(0),
mExtractorFlags(0),
mVideoBuffer(NULL),
mDecryptHandle(NULL),
DataSource::RegisterDefaultSniffers();
mVideoEvent = new AwesomeEvent(this, &AwesomePl