1. 对StagefrightPlayer的好奇
前面对StagefrightPlayer的创建流程已经分析清楚了,即在Android::createPlayer中根据url的type来创建不同的player. StagefrightPlayer是Android提供的,比较经典的一个Player。但个人觉得它不怎么样,还不如ffmpeg支持的codec和parser多。还有一个opencore,更是复杂无比的东东,它采用datapath的方式,类似于大家熟悉的GStreamer。不理解大家为什么会把简单的事情复杂化。
2. StagefrightPlayer是个什么东东?
仔细一看代码,它也是一个空壳公司,其中就一个员工给他干活,它就是AwesomePlayer *mPlayer,在创建StagefrightPlayer时,它就被创建了。StagefrighPlayer中的所有接口都是简单调用AwesomePlayer的对应接口来实现。所以它只是一个接口人,什么都不是。这个AwesomePlayer才是我们的研究重点。
3. AwesomePlayer有些什么东东?
它再神奇,不也就是实现AV播放吗?看看自己直接基于Driver的MyPlayer不也就1000多行代码就把TS播放玩得很爽了。但google为了其开放性,搞得一下子搞不明白。既然想跟着Android混饭吃,只好读它这一大堆没有什么文档和注释的代码了。
AVPlayer肯定具有以下模块:
1) 数据源(如TS流,MP4...)
2) Demux (音视频分离)
3) 音视频解码
4) 音频播放和视频播放
5) 音视频同步
6) 整个工作流程
AwesomePlayer就是把以上6位员工组织起来工作的老板,下面就对每一个问题进行一一分析。
下面先看看它的几位骨干员工:
// Events
sp<TimedEventQueue::Event> mVideoEvent;
sp<TimedEventQueue::Event> mStreamDoneEvent;
sp<TimedEventQueue::Event> mBufferingEvent;
sp<TimedEventQueue::Event> mCheckAudioStatusEvent;
sp<TimedEventQueue::Event> mVideoLagEvent;
// Audio Source and Decoder
void setAudioSource(sp<MediaSource> source);
status_t initAudioDecoder();
// Video Source and Decoder
void setVideoSource(sp<MediaSource> source);
status_t initVideoDecoder(uint32_t flags = 0);
// Data source
sp<DataSource> mFileSource;
// Video render
sp<MediaSource> mVideoTrack;
sp<MediaSource> mVideoSource;
sp<AwesomeRenderer> mVideoRenderer;
// Audio render
sp<MediaSource> mAudioTrack;
sp<MediaSource> mAudioSource;
AudioPlayer *mAudioPlayer;